我正在尝试在 Struts 6.2.0 项目中实现 CSRF。
struts.xml
<package name="struts-security" abstract="true" extends="struts-default">
<interceptors>
<interceptor-stack name="defaultSecurityStack" />
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor" />
<interceptor name="tokenSessionStore" class= "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
</interceptors>
<default-interceptor-ref name = "defaultSecurityStack" />
<global-results>
<result name="error">/error401.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception" />
</global-exception-mappings>
LoginAction.java
@Namespace("/common")
@Action("Login")
@InterceptorRefs({
@InterceptorRef("token"),
@InterceptorRef("tokenSessionStore")
})
@Results({
@Result(name = "input", location = "login.Login", type = "tiles"),
})
login.jsp
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:form method="post" validate="true" theme="simple" name="form" id="paraFrm" >
<s:token />
它回来了
invalid.token
。因为我添加了返回页面,所以它重定向到错误页面。是否需要额外的代码来在操作页面或任何其他地方实现令牌。请重新打开它,因为旧的标记问题对我没有帮助。
要使用
struts.xml
中定义的拦截器,您应该添加注释
@ParentPackage("struts-security")
您正在尝试使用
tokenSession
拦截器。
tokenSession
拦截器:此拦截器基于
构建,提供处理无效令牌的高级逻辑。与普通的令牌拦截器不同,该拦截器将尝试在使用同一会话的多个请求的情况下提供智能故障转移。也就是说,它将阻止后续请求,直到第一个请求完成,然后它不会返回TokenInterceptor
代码,而是尝试显示与未提交多个请求时原始有效操作调用将显示的相同响应首先。invalid.token
示例代码:
<action name="someAction" class="com.examples.SomeAction">
<interceptor-ref name="tokenSession/>
<interceptor-ref name="basicStack"/>
<result name="success">good_result.ftl</result>
</action>
<-- In this case, myMethod of the action class will not
get checked for invalidity of token -->
<action name="someAction" class="com.examples.SomeAction">
<interceptor-ref name="tokenSession>
<param name="excludeMethods">myMethod</param>
</interceptor-ref name="tokenSession>
<interceptor-ref name="basicStack"/>
<result name="success">good_result.ftl</result>
</action>
正如您在示例中看到的,您缺少一些基本的拦截器。