如何在jetty 9中禁用基于cookie的JSESSIONID(以及其他任何)会话跟踪功能?

时间:2013-06-23 14:48:59

标签: spring spring-mvc spring-security jetty

我希望在我的无状态或手动维护状态的Spring MVC应用程序中禁用Jetty 9中的各种会话跟踪功能,但是我找不到任何显示如何执行此操作的示例。

我尝试过以下/WEB-INF/spring-config.xml标记:

...
<security:http use-expressions="true"
               disable-url-rewriting="true"
               create-session="stateless">
...

与战争中的以下/WEB-INF/jetty-web.xml描述符一起:

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Get name="sessionHandler">
        <Get name="sessionManager">
            <Set name="usingCookies" type="boolean">false</Set>
        </Get>
    </Get>
</Configure>

但是,无论何时尝试打开我的应用程序的任何页面,我仍然会获得JSESSIONID cookie。任何提示为什么以及如何解决它?

4 个答案:

答案 0 :(得分:5)

使用servlet 3,可以将会话跟踪模式设置为servlet注册的一部分 - ServletContext#setSessionTrackingModes ...你可以试试。

但是在你的情况下,我会调查谁在调用HttpServletRequest#getSession(...)。在此方法中放置断点以查看谁在调用它。您的应用程序中的某些代码正在初始化会话。

答案 1 :(得分:1)

您可以在请求完成后立即使会话无效,从而实现相同的目标。您可以使用ServletRequestListener这样做:

public class SessionKiller implements ServletRequestListener {

    public void requestInitialized(ServletRequestEvent sre) {
        // no-op
    }

    public void requestDestroyed(ServletRequestEvent sre) {
        final HttpServletRequest servletRequest = (HttpServletRequest)sre.getServletRequest();
        final HttpSession session = servletRequest.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }
}

要使用ServletRequestListener,请将以下内容添加到网络应用web-app中的web.xml元素中:

<listener>
  <listener-class>YOUR-PACKAGE-NAME.SessionKiller</listener-class>
</listener>

答案 2 :(得分:1)

根据user100464的建议,使用已创建的会话无效的替代方法,我使用HttpSessionListener,只要有人试图打开会话,就会抛出异常,例如通过调用request.getSession(),并删除了出现。

public class PreventSessions implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        throw new UnsupportedOperationException("sessions are not allowed");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        throw new UnsupportedOperationException("sessions are not allowed");
    }
}

答案 3 :(得分:0)

使用 Spring Boot 实现的 Pavel Horal suggested in his answer 很简单:

import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Collections;

@Configuration
public class WebContainerConfiguration {
  @Bean
  public ServletContextInitializer servletContextInitializer() {
    return servletContext -> servletContext.setSessionTrackingModes(Collections.emptySet());
  }
}

对我来说工作得很好。谢谢!