如何在没有表单的情况下通过ajax传递struts2令牌?

时间:2013-11-12 01:56:38

标签: ajax struts2 token interceptor

我正在尝试使用Struts附带的token拦截器来实现CSRF检查。但是,我没有使用<form />而是在某些JS中进行AJAX调用:

foo.jsp:

<!DOCTYPE html>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<body>
    <s:token />
    <script>
        var strutsToken = "<s:property value="#session['struts.tokens.token']" />";
    </script>
    <script src="bar.js"></script>
</body>
</html>

bar.js:

$.ajax({
    url: '/endpoint',
    data: strutsToken,
    dataType: 'jsonp',
    cache: true,
    success: function() { console.log('success'); },
    error: function() { console.log('failure'); }
});

我已经确认令牌值正在进入JS变量:

> strutsToken
"N3ZLLLR2Y3QGMZP0L3UCYWI5CO5NYZEY"

不幸的是,当发出AJAX请求时,服务器上会抛出invalid-token错误。

我试图做的是什么,如果是,怎么做?

1 个答案:

答案 0 :(得分:5)

目前这是$.ajax电话的要求:

GET /endpoint?N3ZLLLR2Y3QGMZP0L3UCYWI5CO5NYZEY

您需要为令牌指定一个参数名称。您还需要提供“struts.token.name”参数:

GET /endpoint?struts.token.name=token&token=N3ZLLLR2Y3QGMZP0L3UCYWI5CO5NYZEY

现在使用原始代码:

var token = {
    "struts.token.name": "token",
    "token": strutsToken
};

$.ajax({
    url: '/endpoint',
    data: token,
    dataType: 'jsonp',
    cache: true,
    success: function() { console.log('success'); },
    error: function() { console.log('failure'); }
});