思路:使用装饰者模式,定义MyRequestSessionWrapper类继承HttpServletRequestWrapper类,重写session的get和setAttr等方法;然后通过filter在执行servlet前,用MyRequestSessionWrapper对象来代替HttpServletRequest。
代码如下:
public class MyRequestSessionWrapper extends HttpServletRequestWrapper { public MyRequestSessionWrapper(HttpServletRequest request) { super(request); } @Override public HttpSession getSession() { //在分布式集群项目中,从redis中获取共享的session System.out.println("重写了sesson获取方式,从redis获取session~~~"); return super.getSession(); } }
filter替换自定义的request包装类代码如下:
public class MySessionFilter implements Filter { public MySessionFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request = new MyRequestSessionWrapper((HttpServletRequest)request); chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException { } }
另外,过滤器、拦截器、监听器的区别如下:
过滤器:【可配在web.xml】过滤器Filter常用来过滤字符编码、业务逻辑判断等,依赖servlet容器,即对请求和返回等进行过滤,预处理或后续处理。比如:
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
拦截器:【并不在web.xml】常用于切面编程,基于java的反射机制,比如权限管理、日志等,比如静态文件和请求地址的权限。可对某action或service方法执行前后做操作。比如spring的aop切面编程。
监听器:【可配在web.xml】监听器监听某个事件,并在此事件前后做一些操作。web启动时创建,只初始化一次,web停止则销毁。可用来初始化一些配置信息。比如:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
执行顺序为:过滤前–拦截前–action调用–拦截后–过滤后
拦截器与过滤器的区别(引用网上的对比):
1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2)拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
相关推荐
页面session页面点击会报错,我可以配置拦截器进行拦截操作判断session是否过期。
本案例中 使用maven 搭建spring boot 基本案例 其中实现了 用户登录功能,实现Filter 和 拦截器两种方式 来过滤session登录,后续会使用token方式,请大家关注
防止重复提交 之 更强大的tokenSession拦截器
拦截器和过滤器的区别 1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求...
多个服务器部署Tomcat共享Session的方法,自己亲身测试
tomcat用redis共享session需要的jar
session共享方案(tomcat8+redis共享session) 一步一步详细指引
基于springMVC拦截session中的某个值,一般情况下用于拦截session中用户信息是否存在
一个超帅的jsp过滤器 ,对登录进行验证
在was集群中,通常需要设置session共享,按照文档步骤可以完成session共享设置,解决你应用中的问题
主要为大家详细介绍了Springboot实现多服务器session共享,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java实现多次HttpURLConnection共享session,发送两次请求共享同一个session,这样做爬虫的时候就可以爬网站登录后能看到的内容了
web项目集群时共享session方案实践
Spring Boot 使用 Redis 进行配置 Session 共享(Ajax 跨域) 源码下载。
springboot +shiro+redis实现session共享(方案二)1
spring session实现session共享
对于hibernate中session周期的控制
C#不同域名之间的Session共享,挺简单的,也挺有用
PHP实现多服务器session共享之memcache共享