在我的Spring拦截器到达之前如何创建会话?

时间:2013-07-10 14:44:56

标签: java spring session java-ee interceptor

  1. 客户端设备会清除所有Cookie(因此,客户端上不存在JSESSIONID Cookie。)
  2. 客户端向Spring控制器发出请求。
  3. Spring Interceptor拦截请求。
  4. 在Spring拦截器的preHandle()方法的第一行中,我记录了request.getRequestedSessionId()的值,日志显示了这个值,这应该意味着JSESSIONID实际上是从客户那里收到的。但是,我的Fiddler日志显示请求中未发送JSESSIONID

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

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

    如何阻止会话“像这样”创建会话?

    如果重要,请求的资源就像这样实现:

    @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的实例

1 个答案:

答案 0 :(得分:0)

您应该能够使用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>