实现Spring拦截器拦截ajax请求并重定向

    首先,实现拦截器的操作很简单,只要按部就班即可 :

         

public class LoginInterceptor extends HandlerInterceptorAdapter{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("login");
        String k = request.getServletPath();
        if (!k.equals("/admin/login.do")) {
            String type = request.getHeader("X-Requested-With");// XMLHttpRequest
            if (user == null) {
                // 重定向
                String path = request.getContextPath();
                String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";
                //response.sendRedirect(contextPath+"/index.jsp");
                // System.err.println("sendRedirect");
                // 转发
                if (StringUtils.equals("XMLHttpRequest", type)) {
                    // ajax请求
                    response.setHeader("SESSIONSTATUS", "TIMEOUT");
                    response.setHeader("CONTEXTPATH", basePath+"index.jsp");
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);//403 禁止
                    return false;
                } else {
                    response.sendRedirect(basePath+"index.jsp");
                    return false;
                }
            }
            return true;
        }
            return true;
    }
}

 

    继承这个拦截器的类就可以了 重写方法 然后在配置文件中加上:

 

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="main.java.com.hdd.core.Interceptor.LoginInterceptor">
        </bean>
    </mvc:interceptor>
</mvc:interceptors>

     这个bean的位置就是你实现拦截器的位置

 

    要说明的地方就是拦截器的实现中 ,如果直接使用response的重定向方法去重定向 那么一定会失败 因为用的是ajax ajax是异步数据 不会刷新网页 所以自然也不会去跳转页面 , 这个也算是一个使用不方面的地方吧 。所以需要改造一下ajax 

   选一个你的页面里都引入的js 或者是你用需要拦截ajax请求的界面 加入如下代码:

 

$.ajaxSetup( {
//设置ajax请求结束后的执行动作
    complete :
        function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,sessionstatus
            var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
            if (sessionstatus == "TIMEOUT") {
                var win = window;
                while (win != win.top){
                    win = win.top;
                }
                win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
            }
        }
});

 ajaxSetup就是为了给ajax升级所预留的这样一个方法 然后complete函数就是ajax执行完后要执行的函数 无论是成功还是失败都要执行 

 

在代码中可以看出 拦截器先获取了请求的头信息 如果是没有任何东西的 那么就是传统的同步请求 如果是XMLHttpRequest 就是ajax的异步请求 那么就在响应的头信息中放两个参数 用于ajax接受到后去执行 

 最后一点 这种方式的重定向 会让页面先弹出来一瞬间 然后再被重定向的页面所覆盖 让重定向的页面变为最高层级

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值