Spring 如何在jetty 9中禁用基于JSESSIONID cookie(以及任何其他)的会话跟踪功能?
我希望为我的无状态或手动维护的状态Spring MVC应用程序禁用Jetty 9中的各种会话跟踪功能,但我没有找到任何工作示例来说明如何做到这一点 我尝试了以下Spring 如何在jetty 9中禁用基于JSESSIONID cookie(以及任何其他)的会话跟踪功能?,spring,spring-mvc,spring-security,jetty,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/spring config.xml
标记:
...
<security:http use-expressions="true"
disable-url-rewriting="true"
create-session="stateless">
...
但每当我试图打开我的应用程序的任何页面时,我仍然会收到JSESSIONID cookies。任何关于为什么以及如何修复它的提示?使用servlet 3,可以将会话跟踪模式设置为servlet注册的一部分-。。。你可以试试
但是在您的情况下,我将调查谁在调用
HttpServletRequest#getSession(…)
。在此方法中放置断点以查看是谁在调用它。应用程序中的某些代码正在初始化会话。您可以通过在请求完成后立即使会话无效来实现相同的目标。您可以使用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
,请将以下内容添加到webapp的web.xml
中的webapp
元素中:
<listener>
<listener-class>YOUR-PACKAGE-NAME.SessionKiller</listener-class>
</listener>
YOUR-PACKAGE-NAME.SessionKiller
除了用户100464所建议的使创建的会话无效之外,我还使用了一种方法,每当有人试图打开会话时抛出异常,例如通过调用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");
}
}
使用Spring Boot实现的功能很简单:
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());
}
}
为我工作很好。谢谢大家!
SessionTrackingModes
只允许您在URL、SSL和COOKIE版本的跟踪之间进行选择,不可能通过这种方式完全禁用它们。Jetty 9中是否有类似Tomcat 7的/META-INF/context.xml
文件的内容
有效地禁用了会话的URL和COOKIE跟踪程序,而不管是否调用了getSession()?这意味着对getSession()
的所有调用都将以错误告终。ServletAPI没有涵盖这一点,我不知道Tomcat中有这样的配置(对Jetty不太熟悉)。但是,您可以实现自己的servlet过滤器,并使用HttpServletRequestWrapper
包装输入请求,然后自己完成。但最终,您需要面对调用getSession()
的地方,并摆脱它们。
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());
}
}