【问题标题】:HTTP Status 403 - Expected CSRF token not found.Has session expired?HTTP 状态 403 - 未找到预期的 CSRF 令牌。会话是否已过期?
【发布时间】:2019-12-17 19:00:24
【问题描述】:

我有一个 Spring MVC 应用程序,视图层是基于 jsp 的。有时我收到这个错误消息,这个消息是真的,会话真的过期了。如果我再次登录,那么一切都很好。 我正在使用以下机制发送 CSRF 令牌: 在 head 部分添加了 2 个元标记:

<meta name="_csrf" content="${_csrf.token}" /> 
<meta name="_csrf_header" content="${_csrf.headerName}" />

在每次 Ajax 调用中,都会检索令牌和标头:

var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");

然后使用 XMLHttpRequest 发送此标头和令牌:

$.ajax({
        type : "GET",
        url : xxx,

        beforeSend : function(xhr) {
            xhr.setRequestHeader(header, token);
        },
        complete : function() {
        },
        success : function(response) {
        }       
});

这就是大多数jsp页面中的情况。我尝试在警报消息中捕获令牌并且它有效。如果会话已通过一个页面过期,我想将用户重定向到登录页面,该页面将显示用户被重定向的原因。这个怎么办?

在服务器端 Spring 我们使用了基于 xml 的配置:

<http auto-config="true"  use-expressions="true">
  ...
  <csrf/>
</http>

【问题讨论】:

    标签: spring-mvc jsp csrf


    【解决方案1】:

    我在 application-security.xml 中添加了以下内容,它解决了这个特定场景的问题,尽管我在其他一些场景中面临 CSRF 异常:

    <http auto-config="true"  use-expressions="true">
    ...
    
    <session-management invalid-session-url="/login">
            <concurrency-control expired-url="/login" />
        </session-management>
    </http>
    

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 2016-03-21
      • 2015-10-21
      • 2016-03-13
      • 1970-01-01
      • 2015-12-10
      • 2016-05-24
      • 2017-05-02
      • 1970-01-01
      相关资源
      最近更新 更多