【发布时间】: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