过滤器实现登录拦截需要注意的问题(AJAX请求的处理)

1.问题描述:

最近自己在写demo时遇到一个问题,在ajax请求时用Filter做登录拦截,结果页面不跳转(Ajax是不能做转发和重定向的)、、、、

最终的最终在同事zt的提示下,恍然大悟,虽然很基本的问题,但也纠结了好久,只能说太菜,记录下来,以免以后再犯。

2.解决办法:

在doFilter方法中判断是否为Ajax请求,做进一步处理

代码如下:

/**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        HttpServletResponse resp=(HttpServletResponse) response;
        HttpServletRequest req=(HttpServletRequest) request;
        String url = req.getRequestURI();
        System.out.println(url);
        HttpSession session = ((HttpServletRequest) request).getSession();
        String path = req.getContextPath();
        String basePath= req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+path+"/";
        basePath=basePath+"rest/userManager/loginOut";
        try {
            // 过滤掉登陆和退出请求
            if ((url.indexOf("/ddoa/rest/userManager/login") >= 0)|| (url.indexOf("/ddoa/rest/userManager/loginOut") >= 0)) {
                chain.doFilter(request, response);
            } else {
                if (null != session) {
                    Map<Object, Object> map = (Map<Object, Object>) session.getAttribute("userMap");
                     if(null!=map){
                          chain.doFilter(request, response);
                     }else{
                         //1:判断是否是ajax请求
                            if (req.getHeader("x-requested-with") != null&& "XMLHttpRequest".equalsIgnoreCase(req.getHeader("x-requested-with"))) {   
                                //向http头添加 状态 sessionstatus
                                resp.setHeader("sessionstatus","timeout");
                                resp.setStatus(403);
                                //向http头添加登录的url
                                resp.addHeader("loginPath", basePath);
                                chain.doFilter(request, response);
                                return ;
                            }else{
                                resp.sendRedirect(basePath);
                            }
                     }
                } else {
                     //1:判断是否是ajax请求
                    if (req.getHeader("x-requested-with") != null&& "XMLHttpRequest".equalsIgnoreCase(req.getHeader("x-requested-with"))) {   
                        //向http头添加 状态 sessionstatus
                        resp.setHeader("sessionstatus","timeout");
                        resp.setStatus(403);
                        //向http头添加登录的url
                        resp.addHeader("loginPath", basePath);
                        chain.doFilter(request, response);
                        return ;
                    }else{
                        resp.sendRedirect(basePath);
                    }
                }
            }
        } catch (IOException | ServletException e) {
            e.printStackTrace();
        }
    }

转载于:https://my.oschina.net/u/3218855/blog/913893

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值