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

来源:互联网 发布:淘宝卖家电话人工服务 编辑:程序博客网 时间:2024/06/02 13:12

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

         

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接受到后去执行 

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



原创粉丝点击