小编cut*_*ind的帖子

Play 框架 2.6 CSRF 和会话

我遇到了奇怪的问题。我正在我的网站上实现购物车功能,并使用会话来存储购物车位置。我有一个 POST 操作来向购物车添加新位置,并且我启用了 CSRF 过滤器来保护网站。我在产品页面上用 ajax 调用它,所以第一个调用没问题,但第二个说 Unauthorized 并且在日志中有[CSRF] Check failed because no token found in headers for /cart. 但它有。我称之为:

 $("form").submit(function(e){
        e.preventDefault();
        $.ajax({
            url: '/cart',
            method: 'POST',
            data: getCartPosition(),
            beforeSend: function(xhr){xhr.setRequestHeader('Csrf-Token', $('input[name=csrfToken]').val());},
            success: function (data, textStatus) {
                alert('Added!');
            },
            error: function (error) {
                alert('Error!');
            }
        });
    });
Run Code Online (Sandbox Code Playgroud)

我将 CSRF 令牌放在模板中的某处:

@CSRF.formField
Run Code Online (Sandbox Code Playgroud)

它在请求中:

在此处输入图片说明

我在配置中启用了这个

play.filters.csrf.bypassCorsTrustedOrigins=true 
play.filters.hosts {
  # Allow requests to example.com, its subdomains, and localhost:9000
  allowed = ["localhost:9000", "localhost:4200"]
}
Run Code Online (Sandbox Code Playgroud)

但是奇怪的是,它似乎将 csrfToken 放在会话中,因为在请求失败后我有这样的会话

Session(Map(cart -> {"positions":
[{"trackId":1},{"trackId":24},{"trackId":20}]}, 
username …
Run Code Online (Sandbox Code Playgroud)

scala csrf playframework

6
推荐指数
1
解决办法
1017
查看次数

标签 统计

csrf ×1

playframework ×1

scala ×1