• java Servlet Filter 拦截Ajax请求,统一处理session超时的问题


    后台增加filter,注意不要把druid也屏蔽了

    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.subject.Subject;
    
    import cn.zsmy.constant.Constant;
    import cn.zsmy.entity.User;
    
    /** 
     * session超时过滤 
     *  
     * @date 2016-10-20
     */  
    public class SessionFilter implements Filter {  
          
        @Override  
        public void init(FilterConfig filterConfig) throws ServletException {  
      
        }  
      
        @Override  
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,  
                ServletException {  
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;  
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;  
           
            //只过滤了ajax请求时session超时
             if (httpServletRequest.getHeader("x-requested-with") != null  
                     && httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {  
                     Subject subject = SecurityUtils.getSubject();
                    User user = (User) subject.getPrincipal();
                    if(user == null){
                        Constant.MY_LOG.debug("filter:sessionstatus timeout!");
                        //如果是ajax请求响应头会有,x-requested-with  
                        httpServletResponse.setHeader("sessionstatus", "timeout");//在响应头设置session状态  
                        return;  
                    }
             } 
         
            chain.doFilter(request, response);  
        }  
      
        @Override  
        public void destroy() {  
      
        }  
      
    } 

    web.xml加入过滤器配置,注意不要把druid也屏蔽了,url-pattern可以指定过滤的东西

    <!--session超时过滤处理 -->
        <filter>
            <filter-name>sessionFilter</filter-name>
            <filter-class>cn.zsmy.palmdoctor.filter.SessionFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>sessionFilter</filter-name>
            <!-- <url-pattern>/*</url-pattern> -->
            <url-pattern>*.do</url-pattern>
        </filter-mapping>

    在公共的js文件中加入以下全局控制ajax的配置

    <c:set var="appPath" value="<%=request.getContextPath()%>"/>

    <script type="text/javascript"> $(function(){ $.ajaxSetup ({ cache: false, //关闭AJAX缓存 async:false, //同步请求 contentType:"application/x-www-form-urlencoded;charset=utf-8", complete:function(XMLHttpRequest,textStatus){ //通过XMLHttpRequest取得响应头,sessionstatus, var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); if(sessionstatus=="timeout"){ alert("由于您长时间未操作,登录已失效,请重新登录"); parent.location.href = "${appPath}/login.do"; } } }); }); </script>
  • 相关阅读:
    .NET CORE 3.1.5 跨域设置
    NET CORE WebAPI 搭建--基础搭建
    EF 表中中多次指定了列名解决办法
    .Net Core 3.1.2 区域路由配置【原创】
    浅谈DevOps
    阿里云服务器SQLSERVER 2019 远程服务器环境搭建【原创】【转载请注明出处】
    c# vs2019 Window服务搭建
    云服务器和域名的使用简历
    WAI-ARIA无障碍网页资料
    kendoUI toolbar kendoComboBox 使用
  • 原文地址:https://www.cnblogs.com/shihaiming/p/5981086.html
Copyright © 2020-2023  润新知