您的位置:首页 > Web前端

Shiro中Session过期页面跳转回登录页面处理问题

2017-09-28 17:55 489 查看
Session超时的两种情况:

shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时;

解决问题的思路:通过定义过滤器来检查是否Session过期问题,当前是否session超时,超时判定是否是ajax请求,如果是ajax请求,则在response头部设置session-status值,返回到前端读取到相应值后进行处理;

后台代码

package xxxxxx.sys_common.core.shiro.filter;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import org.apache.shiro.web.filter.AccessControlFilter;

import xxxxxx.model.entity.SysUser;

import xxxxxx.core.shiro.token.manager.TokenManager;

import xxxxxx.utils.LoggerUtils;

/**

 * 判断登录过滤器

 */

public class LoginFilter extends AccessControlFilter {

    /**

     * 是否允许访问

     */

    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {

        SysUser token = TokenManager.getToken();

        //Session未失效时验证通过

        if(null != token || isLoginRequest(request, response)){

            return Boolean.TRUE;

        }

       //如果是ajax请求响应头会有,x-requested-with 

       if(ShiroFilterUtils.isAjax(request)){

            LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!");

            ShiroFilterUtils.out(response, resultMap);

            //通过返回TRUE,通过前台的统一AJAX接受头部设置的sessionstatus参数,判断是否跳转到登录页面

            return Boolean.TRUE;

        }//FALSE  Session失效,切实非AJAX请求,验证是否,调用onAccessDenied跳转到登录页面

        return Boolean.FALSE;

    }

    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {

        //保存Request和Response 到登录后的链接

        saveRequestAndRedirectToLogin(request, response);

        return false;

    }

}

package xxxxxx.core.shiro.filter;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Map;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import xxxxxx.LoggerUtils;

import net.sf.json.JSONObject;

/**

 * Shiro Filter 工具类

 *

 */

public class ShiroFilterUtils {

    final static Class<? extends ShiroFilterUtils> CLAZZ = ShiroFilterUtils.class;

    //登录页面

    static final String LOGIN_URL="/u/login";

    //没有授权提醒

    static final String UNAUTHORIZED = "/open/unauthorized";

    

    /**

     *是否是Ajax请求,如果是ajax请求响应头会有,x-requested-with

     * @param request

     * @return

     */

    public static boolean isAjax(ServletRequest request){

        return "XMLHttpRequest".equalsIgnoreCase(((HttpServletRequest)request).getHeader("X-Requested-With"));

    }

    

    /**

     * response 设置超时

     * @param hresponse

     * @param resultMap

     * @throws IOException

     */

    public static void out(ServletResponse servletResponse){

        HttpServletResponse response = (HttpServletResponse) servletResponse;        

        response.setCharacterEncoding("UTF-8");

        //在响应头设置session状态

        response.setHeader("session-status", "timeout");

    }

}

shiro.xml配置文件

<bean id="login" class="com.htdadao.pms.sys_common.core.shiro.filter.LoginFilter"/>

    

 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

        <property name="filters">

            <util:map>

                <entry key="login" value-ref="login"></entry>

            </util:map>

        </property>

    </bean>

前台代码

<script>

      //全局的ajax访问,处理ajax清求时session超时

      $.ajaxSetup({

         contentType:"application/x-www-form-urlencoded;charset=utf-8",

         complete:function(XMLHttpRequest,textStatus){

             //通过XMLHttpRequest取得响应头,sessionstatus,

             var sessionstatus=XMLHttpRequest.getResponseHeader("session-status");

             if(sessionstatus=="timeout"){

                 //如果超时就处理 ,指定要跳转的页面(比如登陆页)

                 window.location.replace("<%=realPath%>"+"/u/login");

             }

          }

       });

 </script>

参考

Shiro中session超时页面跳转的处理  http://blog.csdn.net/jrn1012/article/details/70396502
Ajax状态值及状态码  http://www.cnblogs.com/luoguixin/p/6249566.html
 jQuery - 拦截所有Ajax请求(统一处理超时、返回结果、错误状态码 )(备注:分别可以通过设置header,返回Json,或者设置HTTP的status指的方式返回前台通知超时)http://www.hangge.com/blog/cache/detail_1412.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息