我正在尝试使用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
错误。
我试图做的是什么,如果是,怎么做?
答案 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'); }
});