gpt4 book ai didi

java - Weblogic上如何让Primary Session与Secondary Session共享 "session time out"?

转载 作者:搜寻专家 更新时间:2023-11-01 03:32:18 29 4
gpt4 key购买 nike

更新问题描述以更加具体和详细。

我有一个weblogic 12c,配置了一个集群,集群中有4个节点实例,默认加载算法是Round Robin,复制类型是MAN 。我在所有 4 个节点上部署了一个 Web 应用程序。

我第一次设计的是:

一旦用户 session 失效,执行注销相关的业务逻辑。将逻辑代码放在实现 HttpSession 接口(interface)的 SessionListener.java 的“sessionDestroyed”方法中。大家知道,session失效有两种情况,一种是手动退出,一种是J2ee容器触发超时。我的问题是由于第二种情况而发生的。

问题:

“SessionDestroyed”事件中的业务逻辑代码为一个用户超时执行了两次,这不是预期的,会导致业务错误。我发现节点 A 上的主 Http session 和节点 B 上的备份 session 都触发了 weblogic“SessionDestroyed”事件。

问题:

  1. 为什么节点B上的Backup Session会触发 session 超时事件虽然节点A上的Primary Session已经超时?
  2. 如何让Backup Session知道Primary Session有已经失效了?

附上Log,可以看到第一行和第二行是primary session,第三行是backup session,可以通过行尾的session id来证明。

DEBUG Oct-20-17 01:53:40 [[ACTIVE] ExecuteThread: '9' for queue: 'weblogic.kernel.Default (self-tuning)'] (AMCSessionListener-27  ) - Session: wIc4WB62vlaYR_tMRMIc0WpBHchh5fbwpinxgaig4mJRJFhlPUcj!-1795465203!1400921280!1508478820022 Created at Fri Oct 20 01:53:40 EDT 2017
DEBUG Oct-20-17 02:54:05 [[ACTIVE] ExecuteThread: '9' for queue: 'weblogic.kernel.Default (self-tuning)'] (AMCSessionListener-46 ) - Session: wIc4WB62vlaYR_tMRMIc0WpBHchh5fbwpinxgaig4mJRJFhlPUcj!-1795465203!1400921280!1508478820022 Destroyed at Fri Oct 20 02:54:05 EDT 2017
DEBUG Oct-20-17 02:55:12 [[ACTIVE] ExecuteThread: '17' for queue: 'weblogic.kernel.Default (self-tuning)'] (AMCSessionListener-46 ) - Session: wIc4WB62vlaYR_tMRMIc0WpBHchh5fbwpinxgaig4mJRJFhlPUcj!173379423!1400921280!1508478820022 Destroyed at Fri Oct 20 02:55:12 EDT 2017

下面是我的 weblogic 配置:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app
xmlns="http://www.bea.com/ns/weblogic/90"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
<session-descriptor>
<cookie-path>/AppName</cookie-path>
<persistent-store-type>replicated</persistent-store-type>
<http-proxy-caching-of-cookies>true</http-proxy-caching-of-cookies>
<cookie-secure>true</cookie-secure>
</session-descriptor>
</weblogic-web-app>

这是我在 web 应用程序中的 web.xml 中配置的 session :

<session-config>
<session-timeout>60</session-timeout>
</session-config>

这是我的 SessionListener.java:

public class SessionListener implements HttpSessionListener {

private static Logger logger = Logger.getLogger(SessionListener.class);

@Override
public void sessionCreated(HttpSessionEvent se) {
if (logger.isDebugEnabled()) {
logger.debug("Session: " + se.getSession().getId() + " Created at " + (new java.util.Date()));
}
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
/**
* The business logic code related to logout action
* would be executed twice here, this is not what I want.
**/
if (logger.isDebugEnabled()) {
logger.debug("Session: " + se.getSession().getId() + " Destroyed at " + (new java.util.Date()));
}
}
}

此代码用于手动注销:

@RequestMapping(value = "/logout", method = RequestMethod.GET)
public ModelAndView logout(HttpServletRequest request,
HttpServletResponse response) throws Exception {

...
// Business Logic for Logout
...

request.getSession().invalidate();

CommonViewObject vo = new CommonViewObject();
return renderReponse(request, response, vo, "Login");
}

如有任何建议,我们将不胜感激。我需要解决这个问题,谢谢!

最佳答案

如果您通过 invalidate() 方法强制用户注销,则 HttpSessionListener sessionDestroyed() 方法会被调用两次,一次是在用户注销时,第二次是在延迟一段时间后。

如果在注销后您将用户重定向回应用程序中的网页,就会发生这种情况。您实质上正在做的是开始另一个 session (如果您没有向所有网页添加安全/身份验证要求,这可能不会立即显而易见),并且 延迟第二次调用 sessionDestroyed() 方法是发生超时。

简单的解决方案,在注销时将用户重定向到应用程序之外的网页。

您可能有兴趣看一下:

JDev/ADF: How to log user login/logout/timeout to the database

JSP Servlet session invalidate() does not make session null

关于java - Weblogic上如何让Primary Session与Secondary Session共享 "session time out"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46845049/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com