使用tomcat-redis-session-manager进行统一session管理

下载开源项目

开源项目地址:https://github.com/jcoleman/tomcat-redis-session-manager
下载下来,把src的代码放到自己新建的项目中,注意:对应服务器tomcat版本,这个项目编译要对应修改。本文服务器tomcat8。tomcat7参考下文。https://blog.csdn.net/lzc409973859/article/details/51981079

pom.xml

<dependencies>
        <dependency>
            <groupId>org.apache.tomcatgroupId>
            <artifactId>tomcat-catalinaartifactId>
            <version>8.0.33version>
        dependency>
        <dependency>
            <groupId>redis.clientsgroupId>
            <artifactId>jedisartifactId>
            <version>2.7.2version>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin> 
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.0version>
                <configuration>
                    
                    <source>1.8source>
                    
                    <target>1.8target>
                    
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
        plugins>
    build>

和在tomcat7配置在jdk版本上有点不同。

RedisSessionManager需要修改一个地方

不然会报如下错误:

Caused by: java.lang.NoSuchMethodError: org.apache.catalina.Container.getLoader()Lorg/apache/catalina/Loader;
at com.orangefunction.tomcat.redissessions.RedisSessionManager.initializeSerializer(RedisSessionManager.java:716)
at com.orangefunction.tomcat.redissessions.RedisSessionManager.startInternal(RedisSessionManager.java:295)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
… 12 more

修改
使用tomcat-redis-session-manager进行统一session管理_第1张图片

使用tomcat-redis-session-manager进行统一session管理_第2张图片

打jar包

打包为:tomcat-redis-session-manager-0.0.1-SNAPSHOT.jar
同时把:jedis-2.7.2.jar、commons-pool2-2.0.jar 这3个放到服务器tomcat8 lib目录下。使用maven命令:mvn dependency copy-dependencies 从该项目中导出依赖到target/dependency下
使用tomcat-redis-session-manager进行统一session管理_第3张图片

修改conf/context.xml

<Context>

    
    
    <WatchedResource>WEB-INF/web.xmlWatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xmlWatchedResource>

    
    

    
    
    
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
    host="193.112.76.19"  
    port="6379"  
    database="0"
    password="你的密码"  
    maxInactiveInterval="60" />
Context>

验证

建立一个demo

  • controller
@Controller
public class Test {
    @RequestMapping("/test")
    public String test(HttpSession session, HttpServletRequest request) {
        request.setAttribute("id", session.getId());
        return "index";
    }

}
  • jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%-- <%@ page isELIgnored ="false" %>   --%>

<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'TestUpload.jsp' starting pagetitle>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
head>

<body>
我的session:${id}
    <br> sessionid=<%=session.getId()%>

body>
html>

没使用tomcat-redis-session-manager前,每次访问页面的sessionId都会发生变化。加入配置后,就不变了,同时使用客户端工具连接redis查看里面也会生成一个记录。
注意:

  1. 同时网上说不设密码会报错(未校验):NOAUTH Authentication required.
  2. 需要特别注意的是项目中要存入session的对象必须实现序列化,否知会出现序列化错误

总结

通过nginx和这个些session共享策略可以共享同一个session,测试发现单独通过ip:端口的方式会产生一个新的会话session。这样在实际用户使用完全不是个问题。使用域名就是nginx共享,使用ip他不会指定其他机器的ip,用户还是在一个机器的tomcat下,不用session共享。

你可能感兴趣的:(Linux,SpringMVC,reids)