标签: interceptorstack

Struts 2文件上传拦截器配置问题

尝试在我的应用程序中配置Struts 2文件上传拦截器时遇到两个问题.我想更改参数maximumSize(默认值为2 MB,我需要它为5 MB)和消息资源struts.messages.error.file.too.large(应用程序区域设置为pt_BR,因此消息是葡萄牙语,而不是英语).

应用程序当前配置如下:

struts.properties

struts.locale=pt_BR 
struts.custom.i18n.resources=MessageResources
Run Code Online (Sandbox Code Playgroud)

在struts.xml

<package name="default" namespace="/" extends="struts-default">
    <interceptors>
        <interceptor name="login" class="br.com.probank.interceptor.LoginInterceptor"/>
        <interceptor-stack name="defaultLoginStack">
            <interceptor-ref name="login" />
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="defaultLoginStack" />
    ...
</package>

...
<package name="proposta" namespace="/proposta" extends="default">
    <action name="salvarAnexoProposta" method="salvarAnexoProposta" class="br.com.probank.action.AnexoPropostaAction">
        <interceptor-ref name="defaultLoginStack">
            <param name="fileUpload.maximumSize">5242880</param>
        </interceptor-ref>
        <result name="success">/jsp/listagemAnexosPropostaForm.jsp</result>
        <result name="input">/jsp/crudAnexoPropostaForm.jsp</result>
        <result name="error">/jsp/error.jsp</result>
        <result name="redirect" type="redirect">${redirectLink}</result>
    </action>
</package>
Run Code Online (Sandbox Code Playgroud)

MessageResources.properties

...
struts.messages.error.file.too.large=O tamanho do arquivo...
Run Code Online (Sandbox Code Playgroud)

我的Action实现和我的JSP代码没有什么特别之处.他们按照http://struts.apache.org/2.1.6/docs/file-upload-interceptor.html上的示例进行操作.当我尝试上传超过5 MB的文件时,应用程序会显示消息"请求被拒绝,因为其大小(6229458)超过了配置的最大值(2097152)" - 默认的文件上载消息,其默认值为maximumSize.

我尝试将消息资源struts.messages.error.file.too.large放在struts-messages.properties中,但之后消息没有改变.配置文件上传拦截器的正确方法是什么?我正在使用Struts 2 2.1.7.提前致谢.

configuration struts2 file-upload interceptor interceptorstack

7
推荐指数
2
解决办法
2万
查看次数

如何使用struts 2中不同包中定义的拦截器?

我已经定义了一个拦截器如下:

<package name="default" extends="struts-default" >
  <interceptors>
       <interceptor-stack name="myStack">
          <interceptor-ref name="timer"/>
          <interceptor-ref name="logger"/>
        <interceptor-ref name="defaultStack"/>
       </interceptor-stack>
  </interceptors>

 <default-interceptor-ref name="myStack"/>

</package>
Run Code Online (Sandbox Code Playgroud)

然后在另一个命名空间中使用myStack:

<package name="posts" namespace="/posts" extends="struts-default,json-default">

        <action  name="question/ask" class="someclass.QuestionAction">
            <interceptor-ref name="myStack"></interceptor-ref>
            <result name="success">/WEB-INF/jsp/post_question.jsp</result>
            <result name="input">/WEB-INF/jsp/post_question.jsp</result>
        </action>

    </package>
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为在包帖中,它找不到名为myStack的拦截器堆栈.我怎么解决这个问题?

struts2 interceptor interceptorstack

7
推荐指数
1
解决办法
3894
查看次数

意外异常在'类xxx上设置了'xxx':错误设置表达式'xxx',其值为['x',]

我将一些参数传递给ModelDriven<Transporter>通过查询字符串实现的动作类.

<s:form namespace="/admin_side" action="Test" id="dataForm" name="dataForm">
    <s:url id="editURL" action="EditTest" escapeAmp="false">
        <s:param name="transporterId" value="1"/>
        <s:param name="transporterName" value="'DHL'"/>
    </s:url>
    <s:a href="%{editURL}">Click</s:a>
</s:form>
Run Code Online (Sandbox Code Playgroud)

动作类如下.

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
public final class TestAction extends ActionSupport 
                           implements Serializable, Preparable, ModelDriven<Transporter>
{
    private static final long serialVersionUID = 1L;
    private Transporter transporter = new Transporter();

    @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", "transporterId, …
Run Code Online (Sandbox Code Playgroud)

java model-driven struts2 interceptorstack struts2-interceptors

5
推荐指数
1
解决办法
2万
查看次数

在Struts 2中获取拦截器参数

我有以下动作映射

<action name="theAction" ...>
...
    <param name="param1">one</param>
    <param name="param2">two</param>
    ...
    <param name="paramN">nth-number</param>
...
</action>
Run Code Online (Sandbox Code Playgroud)

我可以在Interceptor中使用以下行获取参数映射

Map<String, Object> params = ActionContext.getContext().getParameters();
Run Code Online (Sandbox Code Playgroud)

如上所述,是否有任何方法可以获得以下映射中定义的拦截器参数.

<action name="theAction" ...>
...
    <interceptor-ref name="theInterceptor">
        <param name="param1">one</param>
        <param name="param2">two</param>
        ...
        <param name="paramN">nth-number</param>
    </interceptor-ref>
...
</action>
Run Code Online (Sandbox Code Playgroud)

并且动作参数以下列方式定义,动作参数和拦截器参数应该可以单独访问.

<action name="theAction" ...>
...
    <param name="param1">one</param>
    <param name="param2">two</param>
    ...
    <param name="paramN">nth-number</param>
    ....
    <interceptor-ref name="theInterceptor">
        <param name="param1">one</param>
        <param name="param2">two</param>
        ...
        <param name="paramN">nth-number</param>
    </interceptor-ref>
...
</action>
Run Code Online (Sandbox Code Playgroud)

请注意,我不想在拦截器中声明参数字段

//all fields with their getters and setters
private String param1;
private String param2; …
Run Code Online (Sandbox Code Playgroud)

java parameters struts2 interceptor interceptorstack

5
推荐指数
1
解决办法
1万
查看次数

Struts 2:从defaultStack拦截器中排除验证方法

我希望能够在Struts 2中禁用一个动作的表单验证,但是其余的拦截器堆栈仍然可以运行.

我有一个拦截器,它检查用户是否已登录,我总是希望执行,但对于某些操作(例如输入信息),我不希望validate调用该操作.

我试过做类似以下的事情:

<interceptors>

    <interceptor name="bankingAuthenticator"
        class="csc309.a4.banking.BankUserAuthenticator"/>

    <interceptor-stack name="secureBanking">
        <interceptor-ref name="bankingAuthenticator"/>
        <interceptor-ref name="defaultStack"/>
    </interceptor-stack>

</interceptors>

<default-interceptor-ref name="secureBanking"/>

<action name="Deposit!*" method="{1}" class="csc309.a4.banking.Deposit">
    <result name="success">/banking/Deposit.jsp</result>
    <interceptor-ref name="defaultStack">
        <param name="workflow.excludeMethods">choose</param>
    </interceptor-ref>
</action>
Run Code Online (Sandbox Code Playgroud)

但它在bankingAuthenticator拦截器和验证上都会跳过.

struts2 interceptor interceptorstack

4
推荐指数
1
解决办法
3538
查看次数

如何在布尔值中保留NULL状态从JSP发送空字符串到Action

我在搜索页面中有一个条件是boolean。由于它不是强制性的,因此我不能使用复选框,因为我可能想跳过它。

JSP

<s:select list = '#{ "":"Make your choice...", true:"FOO", false:"BAR" }'
          name = "myBooleanCriterion" />
Run Code Online (Sandbox Code Playgroud)

行动

private Boolean myBooleanCriterion;

/* Getter and Setter */
Run Code Online (Sandbox Code Playgroud)

我们知道boolean默认为false,而Boolean默认为null,则第一次呈现页面时就可以了(显示“做出选择”)。

但是,在POST之后,Struts会实例化Boolean属性(默认为false),即使该属性找到""为值也是如此,因此当我返回JSP时,该值会预先选择为false“ BAR”)。

如果值是"",则如何指示Struts不创建该变量的实例,将其保留为原始null状态?我是否需要创建一个Converter或在.properties文件中指定内容?(我从这个答案中获得的代码基本上与示例.2中的代码相同)

我正在使用(略有自定义)paramsPrepareParamsStack拦截器堆栈。

我觉得自己是否想念一些愚蠢的东西。

jsp boolean struts2 type-conversion interceptorstack

2
推荐指数
1
解决办法
1331
查看次数

拦截器没有在Struts中被调用

我的拦截器(验证)没有在动作之前或之后被调用.任何想法如何让它工作?

注意:每次调用默认拦截器时.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <package name="default" namespace="/" extends="struts-default,json-default">
    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
      <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    </result-types>

    <interceptors>
       <interceptor name="validation" class="ValidatorBaseAction"/>
      <interceptor-stack name="default">
        <interceptor-ref name="logger"/>
      </interceptor-stack>
      <interceptor-stack name="validationStack">
         <interceptor-ref name="validation"/>
         <interceptor-ref name="default"/>
      </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="default" />

    <action
        name="viewRequest"
        class="ViewAction"
        method="execute">
      <interceptor-ref name="validationStack" /> 
      <result name="input" type="redirectAction">explore</result>
      <result name="success" type="redirect">/showRequest.do?${explorerParameters}</result>
    </action>
  </package>
</struts>
Run Code Online (Sandbox Code Playgroud)

java struts2 interceptor interceptorstack struts2-interceptors

2
推荐指数
1
解决办法
1149
查看次数

令牌/令牌会话拦截器导致 HttpSession 上的空指针

我正在研究 struts2 Web 应用程序,我正在使用令牌拦截器处理 CSRF 漏洞。

我所做的是成功和错误,我会将用户重定向到同一页面,但会出现操作错误或成功消息。

<action name="saveApplicationForm" class="action.ApplicationFormAction" 
      method="saveApplicationForm">
        <interceptor-ref name="token" />
        <result name="invalid.token" type="tiles">applicationForm.tiles</result>    
        <result name="input" type="tiles">applicationForm.tiles</result>
</action>
Run Code Online (Sandbox Code Playgroud)

没有令牌/令牌会话拦截器一切正常,但是当我使用拦截器时,我收到了 NullPointerException。

堆栈跟踪

java.lang.NullPointerException: null
at action.ApplicationFormAction.saveApplicationForm(ApplicationFormAction.java:218) ~[ApplicationFormAction.class:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_67]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_67]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450) [xwork-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289) [xwork-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252) [xwork-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.interceptor.TokenInterceptor.handleValidToken(TokenInterceptor.java:193) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.interceptor.TokenInterceptor.handleToken(TokenInterceptor.java:154) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.interceptor.TokenInterceptor.doIntercept(TokenInterceptor.java:142) [struts2-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) [xwork-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) [xwork-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) [struts2-core-2.3.16.3.jar:2.3.16.3] …
Run Code Online (Sandbox Code Playgroud)

java struts2 csrf-protection interceptorstack struts2-interceptors

1
推荐指数
1
解决办法
921
查看次数