Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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
Java Spring在无状态会话管理的情况下添加了JSESSIONID_Java_Spring_Spring Security - Fatal编程技术网

Java Spring在无状态会话管理的情况下添加了JSESSIONID

Java Spring在无状态会话管理的情况下添加了JSESSIONID,java,spring,spring-security,Java,Spring,Spring Security,我正在使用具有以下配置的web应用程序的工作JWT身份验证: @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .exceptionHa

我正在使用具有以下配置的web应用程序的工作JWT身份验证:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
      .and()
      .exceptionHandling()
      .authenticationEntryPoint(
          (req, rsp, e) -> p.sendError(HttpServletResponse.SC_UNAUTHORIZED))
      .and()
      .addFilter(new UsernamePasswordAuthenticationFilter(authenticationManager(),
          jwtConfig))
      .addFilterAfter(new JwtTokenAuthenticationFilter(jwtConfig),
          UsernamePasswordAuthenticationFilter.class)
      .authorizeRequests()
      .antMatchers(HttpMethod.POST, jwtConfig.getUri()).permitAll()
      .anyRequest().authenticated();
}
从SessionCreationPolicy.STATELESS开始,我希望Spring不会自己创建会话。但是,如果我访问了
/login
以外的任何其他资源,我仍然会在响应标题中看到以下条目:

set-cookie: JSESSIONID=...; Path=/; HttpOnly
有人能解释一下这是从哪里来的(可能不是从Spring来的),如果它仍然来自Spring,需要改变什么

编辑:

在我的控制器中进行测试时,会话仍然被注入,如上述令牌所示。我仍然不知道这是从哪里来的

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void create(HttpSession session) {
    if (session != null) {
        System.out.println("Session is existing"); // executes
    }
}

您当前的配置(
sessionCreationPolicy(sessionCreationPolicy.STATELESS)
)确保了Spring安全性(,并且只有Spring安全性

  • 不会创建会话
  • 不会依赖会话来提供身份验证详细信息(例如,提供
    主体

应用程序的任何其他组件(例如,如果使用Spring会话)仍然可以自由创建会话

尝试在应用程序中将会话设置为无。yml:

spring.session.store-type=none

如文档中所述:

即使使用SessionCreationPolicy.STATELESS,仍然可以在spring安全性范围之外创建会话。例如,当您调用request.getSession()或request.getSession(true)时,或者如果您访问会话范围的bean(spring将在内部调用request.getSession(true))

如果将以下内容添加到application.properties,则每次创建会话时都会输出stacktrace,这可能有助于您了解发生了什么

logging.level.org.springframework.session.web.http.SessionRepositoryFilter.SESSION_LOGGER=DEBUG

在文档中,它说无状态Spring安全性永远不会创建HttpSession,也永远不会使用它来获取SecurityContext,我想它会被lambda的顺序覆盖。不过,不要问我工作顺序:/@Gewure非常感谢,我会试着玩一会儿。也许这会有帮助!你可能在使用JSP?他们喜欢创建会话。如果您提出请求,会话将始终被注入(如果不存在,则创建),这与将Spring安全设置为无状态无关。这只是Spring安全性的一个设置,而不是应用程序的其余部分。如果您使用JSP,您将始终获得一个会话,这取决于您的控制器,该控制器也可能创建会话。显然,您确实需要它,否则将不会创建会话。对
/login
以外的其他资源的任何请求都会使用该令牌对用户进行身份验证,然后在Spring会话?除了
/login
之外的任何请求都应该基于JWT对用户进行身份验证。在您当前的配置中,
主体
不应该存储在会话中(这由
无状态
属性确保)。然后我仍然不知道会话来自何处。我已进行编辑以确认会话已被注入。除了安全配置和我的JWT身份验证之外,这只是一个简单的请求。还有其他想法吗?这个答案有用吗@Glains你解决了这个问题吗?请分享。有相同的问题所以我发现:。和().sessionManagement().sessionCreationPolicy(sessionCreationPolicy.NEVER)