【问题标题】:getSession() always creates a new sessiongetSession() 总是创建一个新会话
【发布时间】:2014-05-25 07:19:37
【问题描述】:

通过实现Filter,我们的应用程序中有SecurityFilter类,我们的doFilter方法如下所示。

public void doFilter(ServletRequest sres, ServletResponse sreq,
            FilterChain chain) throws IOException, ServletException {

        LOGGER.debug(Logger.buildLogMessage("Starting SecurityFilter.doFilter"));
        HttpServletRequest request = (HttpServletRequest) sres;
        HttpServletResponse response = (HttpServletResponse) sreq;

        HttpSession session = request.getSession();

我们的 web.xml 中有以下条目

<filter>
        <filter-name>SecurityFilter</filter-name>
        <filter-class>com.a.b.c.web.filter.SecurityFilter</filter-class>
</filter>

<filter-mapping>
        <filter-name>SecurityFilter</filter-name>
        <url-pattern>/resources/*</url-pattern>
</filter-mapping>

我们有很多对我们的应用程序的 REST 调用,它们都通过了这个过滤器。 Java API 文档说,request.getSession() 如果存在则返回一个会话,否则它会创建一个新会话。但在我们的应用程序中,request.getSession() 总是为每个 REST 调用创建一个新会话。这里可能出了什么问题?

【问题讨论】:

  • 从客户端开始,确保它正在发送一个 JSESSIONID cookie。
  • 如果客户端不发送会话cookie作为其请求的一部分,服务器无法知道请求属于哪个会话,因此它会重新创建一个。
  • 通过维护会话,您违反了 REST 架构的基本约束之一
  • @Anirudha 这不是真的。连接是无状态的,而不是会话。
  • python 脚本必须在调用之间保持状态。所以这看起来真的像一个 python 问题,而不是一个 java 问题。乐趣。 stackoverflow.com/questions/923296/…

标签: java session web.xml servlet-filters


【解决方案1】:

如果您的应用程序设置设置为通过 cookie 跟踪 JSESSIONID,如果您从同一浏览器发出请求,应用程序将返回相同的会话,如果您从不同的浏览器发出请求,则返回一个新会话。这显然是因为 cookie 存在于每个浏览器的基础上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2012-01-18
    相关资源
    最近更新 更多