手机端登录shiro验证问题 5C

BS系统,现在加入了手机APP。之前web端未登录时会直接跳转loginUrl设定的地址,会返回一个页面。但是手机端识别不了页面信息,识别json数据。怎么在loginUrl那里判断是手机端或者是web端呢,或者其实实现方式呢

5个回答

服务端方法里面判断:

String userAgent = request.getHeader("User-Agent");
boolean isMobile = isMobile(userAgent);

/**
* 是否为移动端
*
* @param userAgent 浏览器ua
* @return 返回 是:true,否:false
*/
private boolean isMobile(String userAgent) {
boolean isMobile = false;
if (userAgent.toLowerCase().contains("android") || userAgent.toLowerCase().contains("iphone")) {
isMobile = true;
}
return isMobile;
}

z719725611
zbao007 回复qq_25144103: 那你重写的Filter类里面就不要返回页面了,直接返回状态量
2 年多之前 回复
qq_25144103
csdn_lizifei 他手机端那里可以直接携带一个参数是否来自手机
2 年多之前 回复

我觉得是web,因为是网页制作,需要web实现

qq_25144103
csdn_lizifei 不是很明白您说的。app是安卓原生的
2 年多之前 回复

如果单纯只是需要 “在loginUrl那里判断是手机端或者是web端”这个判断 楼上的可以
但我的疑问是app要loginUrl指向的页面做这个判断有啥用 判断了是手机端 app的展示成一个html5的登录页面吗?
你的问题应该是app集成shiro后不知道怎么拿到sessionID吧或者说维护app的登录解决session超时吧

HOORIYE
雨声咚咚 回复qq_25144103: 我的经验是 app服务端集成shiro最大的问题就在于怎么判断session超时。我这边的处理是自己生成一个登录口令作为终端与服务端的通信密匙,服务端生成后放在shiro的session中保存并给予失效时间,如果没有就是失效或未登录,有则继续通信
2 年多之前 回复
qq_25144103
csdn_lizifei 我想如果是手机端请求的话,session超时或者是未登录状态的话,就给他返回一个自定义状态值,就不返回页面了
2 年多之前 回复

我觉得你是因为拦截器有问题,异步请求你响应回去的是一个json串,前端没有对特定json串做处理,从而直接显示的字符串,希望对你有帮助

qq_25144103
csdn_lizifei 拦截器是shiro拦截器,只要是需要登录的地址。都会被拦截,如果未登录时或者是session失效时,都会跳转到loginUrl这个预设的地址
2 年多之前 回复
<!-- 认证数据库存储-->
<bean id="login" class="com.dajia.pbmis.shiro.filter.LoginFilter"/>
<bean id="role" class="com.dajia.pbmis.shiro.filter.RoleFilter"/>
<bean id="permission" class="com.dajia.pbmis.shiro.filter.PermissionFilter"/>
    <!--anon:不需要登录与权限 login:需要登录 permission:需要权限-->
   <property name="filterChainDefinitions">
        <value>
            /auth/**=anon
            /adminPerson/**=login,permission
            /person/**=login,permission
            /customer/**=login,permission
            /organization/**=login,permission
            /log/**=login,permission
            /communityAttention/**=login,permission
            /cdn/**=login,permission
        </value>
    </property>
    <property name="filters">
        <util:map>
            <entry key="login" value-ref="login"></entry>
            <entry key="role" value-ref="role"></entry>
            <entry key="permission" value-ref="permission"></entry>
        </util:map>
    </property>




    public class LoginFilter extends AccessControlFilter {

/**
 * 日志信息
 */
public static Logger logger = Logger.getLogger(LoginFilter.class);
/**
 * 注入rCache
 */
@Autowired
private RCache rCache;

@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o)
        throws Exception {
    String token = ((HttpServletRequest) servletRequest).getHeader("MIS-Token");
    if(StringUtils.isBlank(token)) {
        token = servletRequest.getParameter("token"); //针对非ajax请求获取token
    }
    if(StringUtils.isNotBlank(token)) {
        String currentPersonKey = RedisCacheKey.getCurrentPersonKey(token);
        CurrentPerson currentPerson = rCache.get(currentPersonKey);
        String personID = null;
        String personIP = null;
        String currentIP = HttpUtil.getIp((HttpServletRequest) servletRequest);
        if(null != currentPerson) {
            personID = currentPerson.getPersonID();
            personIP = currentPerson.getPersonIP();
        }
        //personID不能为空&人员缓存IP不能为空&缓存IP等于当前访问IP 否则说明该用户已在其他机器登录 已被踢出
        if(StringUtils.isNotBlank(personID) && StringUtils.isNotBlank(personIP) && personIP.equals(currentIP)) {
            return Boolean.TRUE;
        }
    }
    return Boolean.FALSE;

}

@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response)
        throws Exception {
    //表示没有登录或被登出,返回未登录状态码
    ReturnResult returnResult = new ReturnResult();
    returnResult.setErrorMsg("未登录");
    returnResult.setErrorCode(AuthErrorCodeEnum.NOT_LOGIN.getValue());
    returnResult.setSuccess(false);
    ShiroFilterUtils.out(response, returnResult);
    return Boolean.FALSE;
}

}
仅供参考

HOORIYE
雨声咚咚 这个可以,楼主可以采纳
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐