关于自定义过滤器获取不到session问题
作者:MrBlackWhite
这篇文章主要介绍了关于自定义过滤器获取不到session问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
自定义过滤器获取不到session
根本原因,多个自定义过滤器执行顺序问题
问题
action请求中request对象为ShiroHttpServletRequest, 可以取到session内容
而在第一个自定义过滤器中request对象为requestfacade,取不到session内容
原因
session由shiro管理,凡是在shiro过滤器顺序之前的自定义过滤器都取不到session内容
解决办法
将shiro过滤器放在第一个位置
登录拦截器取到的session为空
写了一个拦截器
@Configuration public class InterceptorConfig implements WebMvcConfigurer { /** * 注册拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**.html").excludePathPatterns("/Ylogin.html","/Yindex.html","/YRegister.html"); } }
判断有没有登录
然后那时候我这边session.getAttribute(“user”)一直为空
public class MyInterceptor implements HandlerInterceptor { //在请求处理之前进行调用(Controller方法调用之前 @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("开始请求地址拦截"); //获取session HttpSession session = httpServletRequest.getSession(); if (session.getAttribute("user") != null) return true; httpServletResponse.sendRedirect("/Ylogin.html"); return false; } //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle被调用"); } //在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作) @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion被调用"); } }
在另外页面能得到session的值
但是在拦截器那里就session为null,烦了很久,以为是自己写错了拦截器,搞了很久最后才知道,是login.js写错了。就是ajax的url写错了
$.ajax({ type: "POST", url: "/user/doLogin", dataType: "json", data:user, async:false, success: function(res) {} })
因为我以前地址写的是url:“http://127.0.0.1:8080/user/doLogin”,把前面的ip地址省略就行了,ip地址和localhost的区别
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。