我正在使用具有以下配置的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
}
}
5条答案
按热度按时间ejk8hzay1#
您当前的配置(
sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)确保了Spring-Security(且仅Spring-Security)Principal
)。您的应用程序的任何其他组件(例如,如果您要使用Spring-Session)仍然可以自由创建会话。
vwoqyblh2#
尝试在应用程序中将会话设置为无。yml:
如在以下文献中所提到的:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-session.html
8hhllhi23#
即使使用SessionCreationPolicy.STATELESS,会话仍然可以在spring安全范围之外创建。例如,当您调用request.getSession()或request.getSession(true)时,或者如果您访问一个会话作用域bean(spring内部将调用request.getSession(true))。
如果您将以下内容添加到application.properties,则每次创建会话时都会输出一个stacktrace,这可能有助于您了解发生了什么。
uyhoqukh4#
贷记至nils petersohn:
至少在Firefox中为我解决了这个问题。www.example.com中的spring.session.store-type=noneapplication.properties没有任何效果。
72qzrwbm5#
我也遇到了同样的问题。我发现HttpSession注入会创建一个会话(如果没有的话)。所以你必须自己获取会话,并确保在getSession()方法中使用false参数。所以试试这个: