我在<s:form>
内的每个页面上都有一个隐藏字段,代表一个安全令牌(Spring安全性),它由安全框架(而不是Struts)自动初始化和维护。
因此,相应的动作类中不需要此字段的getter和setter。
由于动作类中没有此字段的getter和setter,因此它会在服务器终端上产生一个非常不必要的消息,如下所示。
SEVERE:开发人员通知(将struts.devMode设置为false以禁用 此消息):意外的异常在'class上设置了'_csrf' actions.CategoryAction:使用值设置表达式'_csrf'时出错 ['673b1d7a-6ab2-4241-86b9-0ccfe8094356',]
可以通过在struts.devMode
或web.xml
(或甚至在struts.xml
中)禁用struts.properties
来抑制此消息本身。
但是有没有办法绕过这个字段,甚至没有达到动作类?仅仅因为Spring字段的值将由Spring安全框架而不是Struts使用。 Struts根本不需要它。
其中一个动作类(它只是一个测试用例):
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
public final class TestAction extends ActionSupport implements Preparable
{
public TestAction() {}
//Some validators as required.
@Action(value = "AddOrUpdate",
results = {
@Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Test"}),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs={
@InterceptorRef(value="paramsPrepareParamsStack", params={"params.acceptParamNames", "param1, param2", "validation.validateAnnotatedMethodOnly", "true"})
})
public String insertOrUpdate(){
// Do something. Add or update a row to the database (one at a time).
return ActionSupport.SUCCESS;
}
@Action(value = "Test",
results = {
@Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs = {
@InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "param1, param2", "validation.validateAnnotatedMethodOnly", "true"})})
public String load() throws Exception {
//This method is just required to return an initial view on page load.
return ActionSupport.SUCCESS;
}
@Override
public void prepare() throws Exception {}
}
Struts表单绑定到上面的操作类。
<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm">
<!--Some Struts elements as required like <s:textfield>-->
<s:hidden name="%{#attr._csrf.parameterName}" value="%{#attr._csrf.token}"/>
<!--This hidden field is automatically initialized to a random, hard-to-guess string-->
<!--Its name is _csrf which is mandatory by design, AFAIK.-->
<s:submit value="Submit" action="AddOrUpdate"/>
<!--The action of this button is mapped to insertOrUpdate() method in the action class.-->
<!--When this button is clicked, the insertOrUpdate() method in the action class is invoked.-->
<s:form>
答案 0 :(得分:0)
我在非struts应用程序中尝试了这一点,但你可以做的是将字段设置为禁用和隐藏。
据我所知,
Elements with Disabled attribute are not submitted or you can say their values are not posted
。
由于<s:from>
最终会扩展为<form>
,因此可能会有效。我不知道安全框架会对它做出怎样的反应,但请告诉我它是否适用于你:)
<强>更新强>
我不知道这是否会导致一些性能问题。但我认为有一个解决方法。
我们能做的是编写一个拦截器,从值堆栈访问 value-stack 和pop变量,这样变量就不会到达动作类。我相信这会奏效。这是我能想到的最终方式。所以手指越过了。