【问题标题】:How is a session being created before my Spring interceptor is reached?在到达我的 Spring 拦截器之前如何创建会话?
【发布时间】:2013-07-10 14:44:56
【问题描述】:
  1. 客户端设备清除所有 cookie(因此,客户端上不存在 JSESSIONID cookie)。
  2. 客户端向 Spring 控制器发出请求。
  3. Spring Interceptor 拦截请求。

在 Spring 拦截器的 preHandle() 方法的第一行,我记录了 request.getRequestedSessionId() 的值,并且日志显示了这个值,这应该意味着实际上收到了 JSESSIONID从客户端。但是,我的 Fiddler 日志显示请求中没有发送 JSESSIONID

此外,request.getSession(false).getId() 返回相同的JSESSIONID

那么,在到达拦截器之前如何/何时/为什么创建会话和JSESSIONID?如果客户端没有发送JSESSIONID cookie,我希望request.getRequestedSessionId() 为空。

我如何防止像这样“即时”创建会话?

如果重要的话,被请求的资源是这样实现的:

@Controller
public class LoginController {
   .
   .
   .
   @RequestMapping(value = { "/controller/index.do" })
   public final ModelAndView login(final HttpServletRequest request, final HttpServletResponse response) {
      .
      .
      .

编辑 - 正如this answer 中提到的,如果还没有会话,我不理解每次调用 JSP 页面都会隐式创建新会话。但这会在到达拦截器之前发生吗?

EDIT2 -拦截器是org.springframework.web.servlet.handler.HandlerInterceptorAdapter的实例

【问题讨论】:

  • 你在客户端使用 JSP 吗?
  • @happybuddha 好点,请看我的编辑。
  • 您想添加有关正在使用的拦截器的详细信息吗?
  • 尝试使用 servlet filter 而不是 Spring interceptor。会话由 Java EE 容器在拦截器之前建立。
  • @happybuddha 拦截器是org.springframework.web.servlet.handler.HandlerInterceptorAdapter的实例

标签: java spring session jakarta-ee interceptor


【解决方案1】:

您应该能够使用 servlet 过滤器。像这样的东西(未经测试):

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
      ServletException {
    HttpServletRequest request = (HttpServletRequest) req;         
    HttpSession session = request.getSession(false);
    HttpServletResponse response = (HttpServletResponse) resp;
    if (session == null) {
      // no session has been established yet      
    }
    chain.doFilter(req, resp); 
  }

  public void destroy() {
    // TODO Auto-generated method stub

  }

  public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub

  }
}

那么,在你的web.xml

<filter>
  <filter-name>SessionFilter</filter-name>
  <filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>SessionFilter</filter-name>
  <url-pattern>/*</url-pattern> <!-- or whatever specific URL mappings you need -->
</filter-mapping> 

【讨论】:

  • 谢谢!我想我可以使用 servlet 过滤器来检测会话何时被即时创建。
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 2011-04-04
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2016-06-28
相关资源
最近更新 更多