spring | 您所在的位置:网站首页 › 三相整流电路仿真 › spring |
关于session共享的方式有多种: (1)通过nginx的ip_hash,根据ip将请求分配到对应的服务器 (2)基于关系型数据库存储 (3)基于cookie存储 (4)服务器内置的session复制域 (5)基于nosql(memcache、redis都可以) 常用的就是1和5,下面研究第5种方式,基于nosql存储session。
其实实现原理也比较简单,在所有的请求之前配置一过滤器,在请求之前操作session,其实spring-session中真正起作用的session过滤器是:SessionRepositoryFilter。spring-session集成了redis与mongodb。 ===========session存到redis中的研究==========1.添加maven依赖 4.0.0 cn.qlq sessionDemo 0.0.1-SNAPSHOT war org.springframework.session spring-session-data-redis 1.2.1.RELEASE redis.clients jedis 2.8.1 org.springframework spring-web 4.2.5 javax.servlet servlet-api 2.5 provided javax.servlet jsp-api 2.0 provided org.apache.maven.plugins maven-compiler-plugin 1.7 1.7 UTF-8 org.apache.tomcat.maven tomcat7-maven-plugin 2.2 88 /sess UTF-8 tomcat7
2.web.xml添加过滤器 sessionDemo index.jsp contextConfigLocation classpath:springMVC.xml org.springframework.web.context.ContextLoaderListener springSessionRepositoryFilter org.springframework.web.filter.DelegatingFilterProxy springSessionRepositoryFilter /*
3.springMVC.xml配置bean
4.index.jsp简单的读取一下sessioid DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> Insert title here jsessionid=${pageContext.session.id}结果: 启动tomcat访问之后查看页面:
可视化界面查看redis库中的数据: redis中的key:
可视化界面中查看:
在redis中通过flushall清空所有数据之后再次刷新界面发现重新生成sessionid,确实是与redis中session同步。
补充:这里需要注意,如果需要在session中存bean的话,bean需要实现Serializable接口。 例如: package sessionDemo; import java.io.Serializable; public class User implements Serializable { /** * */ private static final long serialVersionUID = -5654418863461227475L; private String username; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static long getSerialversionuid() { return serialVersionUID; } public User(String username, int age) { super(); this.username = username; this.age = age; } }
修改页面: DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> Insert title here jsessionid=${pageContext.session.id} ${user.username}
访问页面查看效果:
查看redis:
补充:关于org.springframework.web.filter.DelegatingFilterProxy过滤器的使用 DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过Spring容器来管理servlet filter的生命周期,还有就是如果filter中需要一些Spring容器的实例,可以通过spring直接注入,另外读取一些配置文件这些便利的操作都可以通过Spring来配置实现。
DelegatingFilterProxy的使用方法: 首先在web.xml中配置: filterName org.springframework.web.filter.DelegatingFilterProxy filterName /*
然后在Spring的配置文件中,配置具体的Filter类的实例。
在Spring中配置的bean的name要和web.xml中的一样 或者在DelegatingFilterProxy的filter配置中配置初始参数:targetBeanName,对应到Spring配置中的beanname 如果要保留Filter原有的init,destroy方法的调用,还需要配置初始化参数targetFilterLifecycle为true,该参数默认为false
在上面session的过滤器使用中,我们在web.xml中配置的filter的name为:springSessionRepositoryFilter,所以spring容器中应该有bean为springSessionRepositoryFilter的过滤器。查阅源码发现如下:SpringHttpSessionConfiguration 类中。(下面是spring4.0提倡的java配置方式,方法的名称就是bean的name,@Bean生命一个bean) @Bean public SessionRepositoryFilter |
CopyRight 2018-2019 实验室设备网 版权所有 |