解决ajax 不处理 SpringMVC 拦截器 页面跳转问题

问题分析:一开始,用拦截器做登录拦截,需求是博客系统,没有登录则没办法评论,但是可以进去观看博客。
测试:发现调试有响应,但是不跳转,查询发现是拦截器没有权限处理ajax


image.png

解决方案:手动指定判断是否为ajax,再做处理
后端拦截器核心代码:


image.png
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            //统一拦截(查询当前session是否存在user)(这里user会在每次登陆成功后,写入session)
            User user = (User) request.getSession ( ).getAttribute ("user");
            if (user != null && !"".equals (user)) {
                return true;
            }
            //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理 否则直接重定向就可以了
            if ("XMLHttpRequest".equals (request.getHeader ("X-Requested-With"))) {
                //告诉ajax我是重定向
                response.setHeader ("REDIRECT", "REDIRECT");
                //告诉ajax我重定向的路径
                response.setHeader ("CONTENTPATH", "/login");
                response.setStatus (HttpServletResponse.SC_FORBIDDEN);
            } else {
                // 如果不是ajax请求,直接跳转
                // response.sendRedirect(request.getContextPath()+"你的登陆页地址");
                response.sendRedirect (request.getContextPath ( ) + "/login");
            }
        } catch (Exception e) {
            e.printStackTrace ( );
        }
        return false;//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
        //如果设置为true时,请求将会继续执行后面的操作

    }
}

前端代码:

image.png
 $.ajax({
                    url: 'saveComment',
                    data: {bid, testa},
                    type:'post',
                    jsonType:'json',
                    success: function (data) {
                        var result = data.result;
                        if (result == 'SUCCESS') {
                            alert('评论成功');
                            // 刷新
                            window.location.reload();
                        }
                    },
                    complete : function(xhr, status) {
                        //拦截器拦截没有权限跳转
                        // 通过xhr取得响应头
                        var REDIRECT = xhr.getResponseHeader("REDIRECT");
                        //如果响应头中包含 REDIRECT 则说明是拦截器返回的
                        if (REDIRECT == "REDIRECT")
                        {
                            document.location.href = xhr.getResponseHeader("CONTEXTPATH");
                        }
                    }
                });

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。