Giter Club home page Giter Club logo

tomcat-cluster-redis-session-manager's Introduction

Tomcat Clustering Redis Session Manager

The Redis session manager is pluggable one. It stores session into Redis for easy distribution of HTTP Requests across a cluster of Tomcat servers.

Here the Sessions are implemented as non-sticky (means, each request can able to go to any server in the cluster, unlike the Apache provided Tomcat clustering setup.)

Request Sessions will be stored into Redis immediately (Session attributes must be Serializable), for the use of other servers. When tomcat receives a request from the client, Sessions are loaded directly from Redis.

Supports Redis default, sentinel and cluster mode, based on the configuration.

Going forward, we no need to enable sticky session (JSESSIONID) in Load Balancer.

Supports:

  • Apache Tomcat 7
  • Apache Tomcat 8
  • Apache Tomcat 9
  • Apache Tomcat 10

Downloads: Total Downloads

Buy Me A Coffee

Maven configuration

<repository>
  <id>repsy</id>
  <name>tomcat-cluster-redis-session-manager-repo</name>
  <url>https://repo.repsy.io/mvn/ranmanic/tomcat-session-manager</url>
</repository>

<dependency>
  <groupId>tomcat-session-manager</groupId>
  <artifactId>redis</artifactId>
  <version>4.0</version>
</dependency>

Pre-requisite:

  1. jedis.jar
  2. commons-pool2.jar
  3. commons-logging.jar

more details.. https://github.com/ran-jit/tomcat-cluster-redis-session-manager/wiki

Steps to be done,

  1. Copy the downloaded jars to your tomcat/lib directory.
tomcat/lib/
  1. Add tomcat system property "catalina.base".
catalina.base="TOMCAT_LOCATION"
example: env "catalina.base=/opt/tomcat" bash
  1. Copy the redis-data-cache.properties file to your tomcat/conf directory and update your Redis server details.
tomcat/conf/redis-data-cache.properties
  1. Add the below two lines in your tomcat/conf/context.xml file.
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
  1. Verify the session expiration time in tomcat/conf/web.xml file.
<session-config>
  <session-timeout>60</session-timeout>
</session-config>

Note:

  • All your session attribute values must implement java.io.Serializable.

Configuration Properties:

PropertyDescription
redis.hostsRedis server running instance IP address and port number
- ex: 127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, ..
- default: 127.0.0.1:6379
redis.passwordRedis protected password
redis.databaseRedis database selection. (Numeric value)
- default: 0
redis.timeoutRedis connection timeout
- default: 2000 ms
redis.cluster.enabledTo enable redis cluster mode
- default: false
- supported values: true/false
redis.sentinel.enabledTo enable redis sentinel mode
- default: false
- supported values: true/false
redis.sentinel.masterRedis sentinel master name
- default: mymaster
lb.sticky-session.enabledTo enable redis and standard session mode

If enabled,
  1. Must be enabled sticky session in your load balancer configuration. Else this manager may not return the updated session values
  2. Session values are stored in local jvm and redis
  3. If redis is down/not responding, requests uses jvm stored session values to process user requests. Redis comes back the values will be synced
- default: false
session.persistent.policiessession persistent policies.

- policies - DEFAULT, SAVE_ON_CHANGE, ALWAYS_SAVE_AFTER_REQUEST
  1. SAVE_ON_CHANGE: every time session.setAttribute() or session.removeAttribute() is called the session will be saved.
  2. ALWAYS_SAVE_AFTER_REQUEST: force saving after every request, regardless of whether or not the manager has detected changes to the session.
- default: DEFAULT
redis.sso.timeoutsingle-sign-on session timeout.
- default: 0 ms (-no expiry)

tomcat-cluster-redis-session-manager's People

Contributors

ran-jit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tomcat-cluster-redis-session-manager's Issues

请问启动报这个错是什么原因呢?

四月 23, 2019 2:57:35 下午 org.apache.coyote.http11.AbstractHttp11Processor process
严重: Error processing request
java.lang.NullPointerException
at com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve.invoke(RedisSessionHandlerValve.java:28)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2575)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2564)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

java.io.NotSerializableException: org.apache.catalina.session.StandardSessionFacade

Hi,My project use springboot2.0.6、tomcat9.0.10、jdk1.8 and use spring security to control login.I can open the login view,but login failed and log say:
tomcat.request.session.redis.SessionManager.save Error occured while saving the session object in data cache..
java.io.NotSerializableException: org.apache.catalina.session.StandardSessionFacade
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.util.HashMap.internalWriteEntries(HashMap.java:1790)
at java.util.HashMap.writeObject(HashMap.java:1363)
at sun.reflect.GeneratedMethodAccessor220.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1128)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeUnshared(ObjectOutputStream.java:415)
at tomcat.request.session.SerializationUtil.getSessionAttributesHashCode(SerializationUtil.java:60)
at tomcat.request.session.redis.SessionManager.save(SessionManager.java:299)
at tomcat.request.session.redis.SessionManager.afterRequest(SessionManager.java:333)
at tomcat.request.session.redis.SessionHandlerValve.invoke(SessionHandlerValve.java:39)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:764)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1388)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

Thanks.

SingleSignOn valve support

Hi, would it be possible to add support for SingleSignOn valve using redis as session storage cache ?
We would like to be able to use tomcats SSO functionality while using redis as SSO session storage.

Deserialization Exception while redirecting to another application

I am getting deserialization exception while redirecting to the another application which is existing in another tomcat server.

Kindly suggest to resolve this issue.

HTTP Status 500 - Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: org.springframework.security.core.context.SecurityContextImpl; local class incompatible: stream classdesc serialVersionUID = 420, local class serialVersionUID = 320

Session time default to 30 min

HI
i am using tomcat8.5
i tomcat-cluster-redis-session-manager with my application,
i have increased session time out at /tomcat/conf/web.xml
but redis session showing as key will expire in 1800 sec
please help me
thanks in advance

Web application is throwing 500 internal server error for the very first http request, due to uncertainity of the redisdb instance (redisdb instance may be down or it might be configured to read only access)

Hi Ranjit,

I was playing with your solution for sharing session in cluster of tomcat servers by deploying a web application in multiple servers , this solution is awesome, however i came across one challenge, that is as below.

Due to some uncertainty of the redisdb instance, instance may not be up, or it may be configured with read only access, in this case when i deploy my war file and hit very first time http request to my server to access welcome page of my application

Due to unavailability of the redisdb instance or if it has only read only access application is getting stopped due to 500 internal server error thrown by api's of tomcat-cluster-redis-session-manager.jar in tomcat server.

is there any option in this solution?. like if any such redisdb instance errors occurs can it be ignored by exception handling ?. to avoid 500 internal server error.....and let the http request served successfully without any error.

due to properly unavailability of redisdb instance entire application is going down.
(in this case we no need of session sharing at least expecting our application should up and running fine )

The second step of this catalina.base="TOMCAT_LOCATION".

Hi, @ran-jit I have encountered some problems, now I got it.

  1. My System environment is Centos7

  2. The second step of this readme document

    • Add tomcat system property "catalina.base".
      • catalina.base="TOMCAT_LOCATION"
        • example: export catalina.base=/opt/tomcat

    the "catalina.base" have a invalid symbol dot "."

as follows : modify catalina.base to catalina_base

  • vi /etc/profile
  • export catalina_base=/your/opt//tomcat
  • source /etc/profile

thanks a lot !

How get I set redis pool connection configration?

There is no way change redis connection pool configuration value.

I saw into the source. it set 5 connection pool.

but I think it is not enough large scale running environment.

it should be possible to change.

5 Seconds retry after connection lost

Hey,

it the 5 Seconds timeout from this error message configurable? Background is that i've confiured my sentinels to switch over master after one second, so this could be much shorter so people won't recognize the outage...

12-Apr-2019 10:06:11.885 SEVERE [MasterListener-intranet-[intranet-redis-ha-announce-4:26379]] redis.clients.jedis.JedisSentinelPool$MasterListener.run Lost connection to Sentinel at intranet-redis-ha-announce-4:26379. Sleeping 5000ms and retrying.
 redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused (Connection refused)
	at redis.clients.jedis.Connection.connect(Connection.java:207)
	at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
	at redis.clients.jedis.Connection.setTimeoutInfinite(Connection.java:94)
	at redis.clients.jedis.Jedis.subscribe(Jedis.java:2678)
	at redis.clients.jedis.JedisSentinelPool$MasterListener.run(JedisSentinelPool.java:291)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at redis.clients.jedis.Connection.connect(Connection.java:184)
	... 4 more

Support system variables in 3.0.1 version

Hi, we want to use your library, but we couldn't use jedis v3, so we have chosen 3.0.1 version of session manager, but we also need system environment support feature, which was introduced only in 3.0.4 version. Is it possible to add this feature to 3.0.1 version please?

redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 11443 192.168.10.2:6379

I using redis cluste. and when I do "session.invalidate();"

"JedisMovedDataException" error occured

I using this version : tomcat-cluster-redis-session-manager-3.0.1
and my tomcat version is "8.0.24"

here is ERROR message

redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 11443 192.168.10.3:6379
at redis.clients.jedis.Protocol.processError(Protocol.java:115)
at redis.clients.jedis.Protocol.process(Protocol.java:161)
at redis.clients.jedis.Protocol.read(Protocol.java:215)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
at redis.clients.jedis.BinaryJedis.setnx(BinaryJedis.java:599)
at tomcat.request.session.data.cache.impl.redis.RedisManager.setnx(RedisManager.java:52)
at tomcat.request.session.data.cache.impl.redis.RedisCache.setnx(RedisCache.java:36)
at tomcat.request.session.redis.SessionManager.createSession(SessionManager.java:100)
at tomcat.request.session.redis.SessionManager.createSession(SessionManager.java:28)
at org.apache.catalina.connector.Request.doGetSession(Request.java:2889)
at org.apache.catalina.connector.Request.getSession(Request.java:2254)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:895)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:568)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:513)
at blackweb.modules.accounts.SessionLoginModule.getLoginUser(SessionLoginModule.java:20)
at blackweb.modules.accounts.CookieLoginActionFilter.preDoAction(CookieLoginActionFilter.java:38)
at huck.pasta2.ActionProcessor$ActionFilterProcessor.preDoAction(ActionProcessor.java:27)
at huck.pasta2.ActionProcessor.process(ActionProcessor.java:110)
at huck.pasta2.DirectoryProcessor.process(DirectoryProcessor.java:79)
at huck.pasta2.Pasta2Servlet.service(Pasta2Servlet.java:86)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:468)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:439)
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:305)
at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:399)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

add the interpretation of variables in the configuration file redis-data-cache.properties

Hi,

Thanks for this plugin that works perfectly :)

So I have a suggestion, just like the other tomcat conf files, it would be nice to be able to use java variables passed at tomcat startup to make dynamic the REDIS_PORT or REDIS_SERVER information, so in a docker context, the conf file would look like this

redis.hosts=${REDIS_SERVER}:${REDIS_PORT}

and deployment would be given the right value depending on the environment.
Currently I have to have a script that does sed before starting the tomcat :(

thanks :)

Could not initialize class tomcat.request.session.data.cache.DataCacheFactory

Caused by: java.lang.NoClassDefFoundError: Could not initialize class tomcat.request.session.data.cache.DataCacheFactory
at tomcat.request.session.redis.SessionManager.initialize(SessionManager.java:206)
at tomcat.request.session.redis.SessionManager.startInternal(SessionManager.java:80)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
... 12 more

NPE in SessionHandlerValve.java accessing Tomcat's /manager app

Hi there, I'm trying out your session manager (thanks!), but I get the following exception in my browser when I try to hit the /manager app:

java.lang.NullPointerException
	tomcat.request.session.redis.SessionHandlerValve.invoke(SessionHandlerValve.java:34)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:748)

I double checked with a fresh tomcat install:

    <Valve className="tomcat.request.session.redis.SessionHandlerValve" />
    <Manager className="tomcat.request.session.redis.SessionManager" />
  • Copy commons-pool2-2.6.2.jar jedis-3.0.1.jar slf4j-api-1.7.26.jar tomcat-cluster-redis-session-manager-3.0.5.1.jar into lib
  • cp redis-data-cache.properties to conf (no changes)
  • ./startup.sh
    Still get the 500 error.

Do you have any suggestions? Do I need to configure the manager app somehow? I'd like to use your session manager, but I know my teammates will try the /manager app. Thanks!

Session are not updating in to the redis

After implementing sessions are not saving into the redis,Please find the below error.

17-May-2019 17:38:53.771 SEVERE [http-nio-8080-exec-7] tomcat.request.session.redis.SessionManager.save Error occurred while saving the session object in data cache..
java.io.NotSerializableException: org.apache.catalina.loader.ParallelWebappClassLoader

Add tomcat system property "catalina.base"?

How can i do if i want to deploy multiple tomcats on one server with different ports ?
Such as , /home/tomcat-8080 /home/tomcat-8081 ...
Can i use the same file (redis-data-cache.properties) ?

Connection to a remote Redis server

Hello,

I'd like to implement jedis on an application that runs with Tomcat and Java,
My redis server is not on the same server that my application and, following the readme, I modified the file redis-data-cache.properties to indicate the IP of my redis server.
However, it seems that this configuration file is not read because the application logs throw me errors such as "java-error: Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host localhost:6379".

Can you please help me ?

Thanks in advance,
Matthieu

JSF2.2--com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError

Dear ran-jit:
Thanks a lot for your contribution! Your tomcat 8 session manager reallys helps me! But it does not work fine in JSF2.2 enviroment, when I use dopost method through the components in the <h:form> , like click a <p:commandlink> or a <p:commandbutton>, when it trigger the request, it throws out an exception in the 29th row of "tomcat.request.session.redis.SessionHandlerValve.invoke", and all the ajax functionalities fails.
The full exception is like this:
31-Aug-2019 00:36:35.144 SEVERE [http-nio-8080-exec-7] com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError javax.faces.application.ViewExpiredException: viewId:/createorder.jsf - can not restore view /createorder.jsf
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:123)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:100)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at tomcat.request.session.redis.SessionHandlerValve.invoke(SessionHandlerValve.java:29)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1533)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1489)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
I really like your work, and I deelpy hope that is works in a JSF circumstance, thanks again and waiting for your reply!

Redis TTL and MaxInactiveInterval issue

SessionManager.java

int timeout = getContextIns().getSessionTimeout() * 60;`
int sessionTimeout = (session == null) ? 0 : session.getMaxInactiveInterval() * 60;

web.xml

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

After session first created, redis TTL shows 108000, why isn't 1800?

Remove * 60 may fix the issue.

Test env is tomcat 7 and JDK 7.

logout defautl ttl 10

The default value of ttl, which changes to redis when you log out, is 10. Is there a way to modify this value?

Can a tomcat container get in a bad state somehow?

We are using the following in our tomcat.xml.

    <Valve className="tomcat.request.session.redis.SessionHandlerValve" asyncSupported="true"/>
    <Manager className="tomcat.request.session.redis.SessionManager" />

We are experiencing a problem where a given tomcat container or several tomcat containers can get in a bad state somehow where seemingly they are retrieving bad and/or incomplete session data from redis. It seems to happen after a container is bounced.

Presumably, containers should be able to be bounced and they should be able to start processing requests for a given jsessionid immediately. However, it seems that the problem we are having is that once a given container is bounced, it's not possible to get back in a "good" state, where it can successfully process requests for a given jsessionid.

Any thoughts on this? Has anyone ever reported anything like this? Thanks in advance!

Error occured while de-serializing the session object

Hi,

I'm getting this error:

SEVERE: Error occured while de-serializing the session object..
java.lang.ClassCastException: tomcat.request.session.SessionMetadata cannot be cast to tomcat.request.session.SessionMetadata
at tomcat.request.session.SerializationUtil.deserializeSessionData(SerializationUtil.java:107)
at tomcat.request.session.redis.SessionManager.findSession(SessionManager.java:226)
at tomcat.request.session.redis.SessionManager.findSession(SessionManager.java:1)
at org.apache.catalina.connector.Request.doGetSession(Request.java:2868)
at org.apache.catalina.connector.Request.getSessionInternal(Request.java:2521)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:429)
at tomcat.request.session.redis.SessionHandlerValve.invoke(SessionHandlerValve.java:37)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

when the session is restored.
The data seems ok in redis but there's no way to solve this problem.
Can you help me?

Thanks in advance.

License Agreement

The software without license agreement can't be used in our company. Can you add a friendly license agreement? Thanks.

版主,报这个错,是什么问题阿

redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:51)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
at tomcat.request.session.data.cache.impl.RedisDataCache$RedisCacheUtil.get(RedisDataCache.java:315)
at tomcat.request.session.data.cache.impl.RedisDataCache.get(RedisDataCache.java:68)
at tomcat.request.session.redis.SessionManager.findSession(SessionManager.java:210)
at tomcat.request.session.redis.SessionManager.findSession(SessionManager.java:37)
at org.apache.catalina.connector.Request.doGetSession(Request.java:2951)
at org.apache.catalina.connector.Request.getSessionInternal(Request.java:2604)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:430)
at tomcat.request.session.redis.SessionHandlerValve.invoke(SessionHandlerValve.java:37)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1156)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.NoSuchElementException: Unable to validate object
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:506)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:49)

Can't connect to alive master.

A redis cluster with 3 nodes(node A,nodeB,nodeC) and slave-serve-stale-data is set to 'no'. I initialized port 7000 as master on echo node at first and 7001-7002 as replicas slave. I configured RedisDataCache.properties as redis.hosts=192.168.168.7:7000, 192.168.168.8:7000, 192.168.168.9:7000. Everything goes OK.
But when I kill redis instance or reboot node to simulate server fault, the cluster status has changed, for example 92.168.168.7:7000 became slave not master any more while 192.168.168.8:7000 or 192.168.168.9:7000 still act as master. The tomcat report Exception says like:
type Exception report message CLUSTERDOWN The cluster is down description The server encountered an internal error that prevented it from fulfilling this request. exception redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is down redis.clients.jedis.Protocol.processError(Protocol.java:115)

How to deal with this issue? Thanks.

logout error

Clearing the session state failed while executing the Session.invalidate();.

tomcat.request.session.redis.SessionManager.findSession Error occurred while de-serializing the session object.. java.io.InvalidObjectException: Could not find a SessionFactory [uuid=d3cbc726-81d4-4369-866c-ee8b4011f054,name=null]

Hi,

06-Jul-2019 09:00:10.467 SEVERE [http-nio-8080-exec-5] tomcat.request.session.redis.SessionManager.findSession Error occurred while de-serializing the session object..
java.io.InvalidObjectException: Could not find a SessionFactory [uuid=d3cbc726-81d4-4369-866c-ee8b4011f054,name=null]
at org.hibernate.internal.SessionFactoryImpl.locateSessionFactoryOnDeserialization(SessionFactoryImpl.java:1781)
at org.hibernate.internal.SessionFactoryImpl.readResolve(SessionFactoryImpl.java:1761)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1250)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2096)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:566)
at org.springframework.aop.framework.AdvisedSupport.readObject(AdvisedSupport.java:551)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1160)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2216)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
at org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1576)
at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1048)
at tomcat.request.session.Session.readObjectData(Session.java:125)
at tomcat.request.session.SerializationUtil.deserializeSessionData(SerializationUtil.java:74)
at tomcat.request.session.redis.SessionManager.findSession(SessionManager.java:160)
at tomcat.request.session.redis.SessionManager.findSession(SessionManager.java:28)
at org.apache.catalina.connector.Request.doGetSession(Request.java:2960)
at org.apache.catalina.connector.Request.getSessionInternal(Request.java:2677)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:460)
at tomcat.request.session.redis.SessionHandlerValve.invoke(SessionHandlerValve.java:29)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)

For this error, I am using the following library file:

  • tomcat-cluster-redis-session-manager-3.0
  • jedis-2.9.0.jar

I tried to use the latest jars but still encountered the same issue. Currently my project is using

  • Apache Tomcat/9.0.19
  • AWS Correto 11 to build war file and run the tomcat server.

Able to assist me?

Thank you.

use jdk1.6 error

JDK1.6 must be used for project reasons。java.lang.UnsupportedClassVersionError: tomcat/request/session/redis/SessionHandlerValve : Unsupported major.minor version 51.0

Error

Error occured while saving the session object in data cache.. -tomcat.request.session.redis.SessionManager
java.io.NotSerializableException: java.lang.Object

Session destruction

Do you need to do this when session is destroyed and call the remove method in session manager when session is destroyed? Or in other ways

Session timeout default to 1800s ,can not be lower

When I set session timeout with
<session-config> <session-timeout>2</session-timeout> </session-config>
I find that timeout can not be set lower than 30 minutes(1800 s).
so is the redis TTl(1800s).
Is that a bug ? Or just something else?
Thanks.

RedisCacheUtil methods close jedis connection incorrect

	public byte[] set(String key, byte[] value) {
		int tries = 0;
		boolean sucess = false;
		String retVal = null;
		do {
			tries++;
			try {
				Jedis jedis = pool.getResource();
				retVal = jedis.set(key.getBytes(), value);
				jedis.close();
				sucess = true;
			} catch (JedisConnectionException ex) {
				log.error(RedisConstants.CONN_FAILED_RETRY_MSG + tries);
				if (tries == NUM_RETRIES)
					throw ex;
			}
		} while (!sucess && tries <= NUM_RETRIES);
		return (retVal != null) ? retVal.getBytes() : null;
	}

try catch体内调用jedis.close(); 很可能导致 不能正常关闭,是否在finally内调用?
bug现象为tomcat 产生很多CLOSE_WAIT的tcp连接,怀疑和这段代码有关
使用的是redis单点服务,redis集群则没有这种情况

session.invalidate is not working

session invalidate does not work after applying redis-session lib.
and then also JSESSION ID is not change.

I'm using Tomcat 8.5.40 and

here ls my code.

HttpSession session = request.getSession();
session.removeAttribute("logonSessData");
session.invalidate();

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.