【问题标题】:synchronize servlet sessions同步 servlet 会话
【发布时间】:2010-09-10 02:19:52
【问题描述】:

我创建了一个使用 OAuthentication 登录 Twitter 的 Web 应用程序,并且登录过程在单个 servlet 上成功运行。在那个 servlet 上,我得到了用户的会话。但是,一旦我第一次移动到另一个 servlet 并尝试再次获取会话,就会创建一个新的。我认为 Web 应用程序会读取客户端 cookie 并为每个客户端创建一个会话?下面,您可以看到客户端会话 ID 在整个 OAuth 过程中保持不变,但在新的 servlet 上发生了变化。我输入了encodedURLS,以防cookies不能正常工作。但是,一旦我重做 OAuth 过程并再次尝试,一切都会同步...

Creating Authentication Session...
Session ID before getting Request Token: 5E5932F144E4838EFDD398407D4BA351
Retrieving request token...
Request token retrieved...
Session ID after getting Request Token: 5E5932F144E4838EFDD398407D4BA351
Swapping request token for access token...
Session ID: F97463A1A2D239B7E6D15D1C5FDAE26B
Sep 9, 2010 1:37:03 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet PostUpdatesServlet threw exception
java.lang.NullPointerException
    at com.twf.PostUpdatesServlet.doPost(PostUpdatesServlet.java:31)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:637)

【问题讨论】:

    标签: session servlets


    【解决方案1】:

    会话取决于域和上下文。如果两个 servlet 都在不同的上下文(不同的 webapp)上运行,那么您需要配置 servletcontainer 以允许在上下文之间共享会话。在 Tomcat 和克隆中,您可以通过将 emptySessionPath 属性设置为 true 来做到这一点。

    如果这些 servlet 实际上在相同的上下文中运行,那么问题出在其他地方。根据目前提供的信息很难确定它。可能是调用了HttpSession#invalidate(),或者客户端发送了一个无效的jsessionid cookie。

    【讨论】:

    • 感谢您的快速回复。两个 servlet 都在相同的上下文/相同的 Web 应用程序中运行。我在一个 servlet 上运行 OAuth 并将响应传递给 JSP。一旦进入该 JSP,就会有一个指向新 servlet 的链接,并且在该新 servlet 中,会话 ID 会发生变化。我很确定我没有在 webapp 中的任何地方使用过无效,所以我要找出为什么客户端 cookie 要么使 ID 无效或发送无效的 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-07-17
    • 2011-08-23
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多