前后端完全分离下,拦截请求,跳转到登录页面

问题描述:

  在前后端完全分离下架构下,大部分数据请求都是通过Ajax异步获取的,如果session过期,拦截Ajax请求,跳转到登录页面(重定向,转发在Ajax请求下,是不可用的)

解决方案:

  1. 后台代码:
    在过滤器或者拦截器中,拦截不符合要求的session请求
String type = request.getHeader("X-Requested-With");// XMLHttpRequest     HttpServletRequest -> request
            if ("XMLHttpRequest".equals(type)) {
                //是ajax请求
                // 异步请求下的重定向
                response.addHeader("FLAG", "-1");
                response.setHeader("SESSIONSTATUS", "TIMEOUT");
                response.setHeader("CONTEXTPATH", php_Address);//重定向目标地址
                response.setStatus(1000);
            } else {
            	//非ajax请求,直接使用重定向
                response.sendRedirect(php_Address);
            }

Spring MVC架构中的监听器,过滤器,拦截器参考

  1. 修改ajax请求后的结束动作

对jQuery文件添加如下函数

$.ajaxSetup({
 //设置ajax请求结束后的执行动作
    complete: function (XMLHttpRequest, textStatus) {
        var url = XMLHttpRequest.getResponseHeader("CONTEXTPATH");
        var flag = XMLHttpRequest.getResponseHeader("FLAG");
        if (flag != "" && flag == "-1") {/*  console.log(url);*/
            window.location.href = url;
        }/* console.log(flag);console.log("1231");*/
    }
});
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
在Spring Boot前后分离项目中,可以使用拦截器(Interceptor)来实现登录拦截的功能。 首先需要定义一个拦截器类,实现Spring的HandlerInterceptor接口。在拦截器类中,可以编写preHandle方法,该方法在请求处理之前被调用。在该方法中,可以获取当前请求的session,判断用户是否已经登录。 代码示例: ``` public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object obj = session.getAttribute("user"); if (obj == null) { response.sendRedirect("/login"); // 未登录登录页面 return false; } return true; } } ``` 在Spring Boot应用中,需要将拦截器注册到拦截器链中。可以在WebMvcConfigurer中配置拦截器: ``` @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/logout", "/css/**", "/js/**", "/img/**"); // 拦截所有请求,除了登录、登出和静态资源 } } ``` 在上述代码中,拦截器注册到了所有请求中(除了登录、登出和静态资源),在preHandle方法中,判断用户是否已经登录,如果未登录,则重定向到登录页面。 需要注意的是,拦截器只能拦截Controller层的请求,对于静态资源的请求,需要在addPathPatterns中排除掉。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值