Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何在jetty 9中禁用基于JSESSIONID cookie(以及任何其他)的会话跟踪功能?_Spring_Spring Mvc_Spring Security_Jetty - Fatal编程技术网

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

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"> ...

我希望为我的无状态或手动维护的状态Spring MVC应用程序禁用Jetty 9中的各种会话跟踪功能,但我没有找到任何工作示例来说明如何做到这一点

我尝试了以下
/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());
  }
}