spring 您所在的位置:网站首页 三相整流电路仿真 spring

spring

2023-08-21 04:14| 来源: 网络整理| 查看: 265

关于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 实验室设备网 版权所有