<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Spring on Java 技术探秘</title>
    <link>https://www.szlinkroutes.com/tags/spring/</link>
    <description>Recent content in Spring on Java 技术探秘</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 13 Sep 2020 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.szlinkroutes.com/tags/spring/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>spring&#43;redis自主实现分布式session</title>
      <link>https://www.szlinkroutes.com/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/spring&#43;redis%E8%87%AA%E4%B8%BB%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8Fsession%E9%9D%9Espring-session%E6%96%B9%E5%BC%8F/</link>
      <pubDate>Sun, 13 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/spring&#43;redis%E8%87%AA%E4%B8%BB%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8Fsession%E9%9D%9Espring-session%E6%96%B9%E5%BC%8F/</guid>
      <description>背景：最近对一个老项目进行改造，使其支持多机部署，其中最关键的一点就是实现多机session共享。项目有多老呢，jdk版本是1.6，spring版本是3.2，jedis版本是2.2。&#xA;1.方案的确定 接到这项目任务后，理所当然地google了，一搜索，发现解决方案分为两大类：&#xA;tomcat的session管理 spring-session 对于“tomcat的session管理”，很不幸，线上代码用的是resin，直接pass了；&#xA;对于“spring-session”，这是spring全家桶系列，项目中正好使用了spring，可以很方便集成，并且原业务代码不用做任何发动，似乎是个不错的选择。但是，在引入spring-session过程中发生了意外：项目中使用的jedis版本不支持！项目中使用的jedis版本是2.2,而spring-session中使用的jedis版本是2.5，有些命令像&amp;quot;set PX/EX NX/XX&amp;quot;，项目中使用的redis是不支持的，但spring-session引入的jedis支持，直接引入的话，风险难以把控，而升级项目中的redis版本的话，代价就比较高了。&#xA;综上所述，以上两个方案都行不能，既然第三方组件行不通，那就只能自主实现了。&#xA;通过参考一些开源项目的实现，自主实现分布式session的关键点有以下几点：&#xA;使用servlet的filter功能来接管session； 使用redis来管理全局session 2.使用filter来接管session 为了实现此功能，我们定义如下几个类：&#xA;SessionFilter：servlet的过滤器，替换原始的session DistributionSession：分布式session，实现了HttpSession类； SessionRequestWrapper：在filter中用来接管session； 类的具体实现如下：&#xA;SessionFilter类&#xA;/** * 该类实现了Filter */ public class SessionFilter implements Filter { /** redis的相关操作 */ @Autowired private RedisExtend redisExtend; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //这里将request转换成自主实现的SessionRequestWrapper //经过传递后，项目中获取到的request就是SessionRequestWrapper ServletRequest servletRequest = new SessionRequestWrapper((HttpServletRequest)request, (HttpServletResponse)response, redisExtend); chain.doFilter(servletRequest, response); } @Override public void destroy() { } } ServletRequestWrap类</description>
    </item>
  </channel>
</rss>
