springmvc学习

前后端分离的情况下 springmvc的拦截器的使用及配置

一、ajax重定向的问题。

默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不重新加载页面的。如果需要用到重定向可以通过以下方法:

第一步:后端代码改造。

在后端(大部分情况都是拦截器)中判断是否需要重定向。

Eg:session过期判断,当判断session已经过期了,就先判断此次请求是否是ajax的请求。

方法:


public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        User user = (User) request.getSession().getAttribute("user");
            if (user == null) {
                // 获取到项目名,以便下面进行重定向
                String homeUrl = request.getContextPath();
                System.out.println("homeUrl = " + homeUrl);
                
                // 如果是 ajax 请求,则设置 session 状态 、CONTEXTPATH(要跳转的路径) 的路径值
                // 如果是ajax请求响应头会有,x-requested-with
                if (request.getHeader("X-Requested-With") != null
                        && request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")) {
                    response.setHeader("SESSIONSTATUS", "TIMEOUT");
                    response.setHeader("CONTEXTPATH", homeUrl + "html/Login.html");
 
                    // FORBIDDEN,forbidden。也就是禁止、403
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                } else {
                    // 如果不是 ajax 请求,则直接跳转即可 但感觉还有点错误 因为每次我没登录就自动跳转了
 
                    response.sendRedirect(homeUrl + "html/Login.html");

                }
            }
        return false;
    }
}

第二步:前端改造ajax属性。
$.ajaxSetup( )
在改动 ajax 之前不要着急,如果在 $.ajax()里的回调函数(success)里面进行修改,那么前端 的代码,就要改动很多,凡是涉及ajax请求的方法,都要加上页面跳转的逻辑了。。。

这里使用 $.ajaxSetup( ),可以看着是对 ajax 的增强,对比与 spring事务的后置增强, $.ajaxSetup( ) 会在每个 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");
                        }
                        // location.href = "https://www.bilibili.com/";
                    }
            })

        });

但是这么做了之后 出现 登录拦截时 重定向次数过多
怀疑 是拦截器设置错了
**情况一:配置排除拦截路径的时候不生效 **

情况二:没有配置排除拦截路径,就是说全部路径都拦截了,导致一直重定向

个人是属于第二种情况 于是在springmvc-servlet.xml中配置 加入了对登录排除拦截的路径
在这里插入图片描述

改过之后 不会在出现无线重定向 但是似乎还有问题 ?? 就是无妨直接在 地址栏里 直接访问其他的页面 比如 localhost:8080/html/Index.html 会报这个错
在这里插入图片描述
待日后排查

附:在这里插入图片描述

参考文章
参考文章2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值