如何在Tomcat应用的JSTL <c:forEach>中为链接添加CSRFToken?
解决Tomcat中循环内链接添加CSRFToken的问题
你目前通过response.encodeURL()给表单action添加CSRFToken的方式是可行的,但循环里的<a>标签直接用EL表达式输出URL不会自动触发编码,这里提供几种实用方案:
方案一:使用JSTL的<c:url>标签
JSTL的<c:url>标签会自动调用encodeURL()方法,帮你把CSRFToken附加到URL上。首先确保页面已引入JSTL核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
然后修改循环内的<a>标签:
<td align="center"> <c:url var="encodedCommentUrl" value="${forsale.commentUrl}" /> <a href="${encodedCommentUrl}">${forsale.name}</a> </td>
<c:url>会自动完成URL编码并附加CSRFToken,最终生成的链接会包含CSRFToken参数。
方案二:在EL中直接调用response.encodeURL()
你也可以直接在EL表达式里调用内置response对象的encodeURL()方法,传入目标URL:
<td align="center"> <a href="${response.encodeURL(forsale.commentUrl)}">${forsale.name}</a> </td>
这种方式无需额外引入标签库,直接利用Tomcat内置对象完成编码和Token附加。
方案三:手动拼接CSRFToken(不推荐)
如果前两种方式不适用,可手动从会话中获取CSRFToken并拼接到URL末尾:
<td align="center"> <a href="${forsale.commentUrl}${forsale.commentUrl.contains('?') ? '&' : '?'}CSRFToken=${sessionScope.CSRFToken}">${forsale.name}</a> </td>
需要注意判断原URL是否已有参数,决定用&还是?拼接,但这种方式需要确保会话中存在CSRFToken属性,灵活性不如前两种,不优先推荐。
内容的提问来源于stack exchange,提问作者TaihouKai
相关产品推荐
相关产品推荐

