禁止在Struts2中将表单元素设置为操作类

时间:2014-02-05 19:23:15

标签: jsp struts2

我在<s:form>内的每个页面上都有一个隐藏字段,代表一个安全令牌(Spring安全性),它由安全框架(而不是Struts)自动初始化和维护。

因此,相应的动作类中不需要此字段的getter和setter。

由于动作类中没有此字段的getter和setter,因此它会在服务器终端上产生一个非常不必要的消息,如下所示。

  

SEVERE:开发人员通知(将struts.devMode设置为false以禁用   此消息):意外的异常在'class上设置了'_csrf'   actions.CategoryAction:使用值设置表达式'_csrf'时出错   ['673b1d7a-6ab2-4241-86b9-0ccfe8094356',]

可以通过在struts.devModeweb.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>

1 个答案:

答案 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变量,这样变量就不会到达动作类。我相信这会奏效。这是我能想到的最终方式。所以手指越过了。