gpt4 book ai didi

java - CSRF - 仅在第一次登录

转载 作者:行者123 更新时间:2023-11-30 03:18:27 25 4
gpt4 key购买 nike

当我在服务器上部署应用程序时,第一次可以毫无问题地登录。但是当我注销时,我在注销发布请求中收到“403 Forbidden”。然后我无法成功登录,因为登录请求出现 403 错误。Ctrl+F5,尝试再次登录......它可以工作,但只能一次。

    @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/apps", "/sites", "/users").authenticated()
.and()
.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}

和 CsrfHeaderFilter 类:

public class CsrfHeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
response.setHeader("X-CSRF-HEADER", token.getHeaderName());

response.setHeader("X-CSRF-PARAM", token.getParameterName());

response.setHeader("X-XSRF-TOKEN", token.getToken());

if (token != null) {
Cookie cookie = WebUtils.getCookie(request, "X-XSRF-TOKEN");
if (cookie == null || token != null && !token.equals(cookie.getValue())) {
cookie = new Cookie("X-XSRF-TOKEN", token.getToken());
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}

在 Angular 中:

$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

如果重要的话,我的应用程序部署在 localhost:8080/myApp。

最佳答案

在某些事件(例如登录注销)之后,CSRF token 会发生变化。因此,下一个 POST 请求将失败,就像您的情况一样。我遇到了同样的问题,经过一番诊断后,发现在登录、注销等之后发送另一个 GET 请求将是解决该问题的最佳方法。 (如果您没有使用 CORS,您也可以让 loginlogout 发送重定向响应)。请参阅 this stackoverflow post 了解更多详细信息。

关于java - CSRF - 仅在第一次登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31947205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com