gpt4 book ai didi

java - 在 Struts 2 中获取拦截器参数

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:14 26 4
gpt4 key购买 nike

我有以下 Action 映射

<action name="theAction" ...>
...
<param name="param1">one</param>
<param name="param2">two</param>
...
<param name="paramN">nth-number</param>
...
</action>

我可以在拦截器中使用以下行获取参数映射

Map<String, Object> params = ActionContext.getContext().getParameters();

和上面一样,有没有办法获取拦截器参数,定义在下面的映射中。

<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>

并且 Action 参数定义如下, Action 参数和拦截器参数应该是分开访问的。

<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>

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

//all fields with their getters and setters
private String param1;
private String param2;
...
private String paramN;

在 Dev Blanked 的回答后,我实现了他的技术。它没有用,所以我在这里分享我的代码。我正在使用 Struts 2.3.1.2。

图书馆

  • asm-3.3.jar
  • asm-commons-3.3.jar
  • asm-tree-3.3.jar
  • commons-fileupload-1.2.2.jar
  • commons-io-2.0.1.jar
  • commons-lang-2.5.jar
  • freemarker-2.3.18.jar
  • javassist-3.11.0.GA.jar
  • ognl-3.0.4.jar
  • struts2-core-2.3.1.2.jar
  • xwork-core-2.3.1.2.jar

Struts.xml

<?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>
<constant name="struts.devMode" value="true" />

<package name="the-base" namespace="/" extends="struts-default" abstract="true">

<interceptors>
<interceptor name="header" class="demo.interceptors.HttpHeaderInterceptor"></interceptor>

<interceptor-stack name="theStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="header"></interceptor-ref>
</interceptor-stack>
</interceptors>

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

</package>

<package name="the-module" extends="the-base">
<action name="theAction">
<result>/the-action.jsp</result>
<interceptor-ref name="theStack">
<param name="header.Cache-control">no-store,no-cache</param>
<param name="header.Pragma">no-cache</param>
<param name="header.Expires">-1</param>
<param name="header.arbitrary">true</param>
</interceptor-ref>
</action>
</package>
</struts>

拦截器

package demo.interceptors;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.StrutsStatics;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class HttpHeaderInterceptor extends AbstractInterceptor {

private final Map<String, String> interceptorConfigs = new HashMap<String, String>();

@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Calling 'intercept' method.");
HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);

for(Entry<String, String> entry: interceptorConfigs.entrySet()) {
String header = entry.getKey();
String value = entry.getValue();
System.out.printf("Adding header: %s=%s\n",header,value);
response.setHeader(header, value);
}

return invocation.invoke();
}

public Map<String, String> getInterceptorConfigs() {
System.out.println("calling method 'getInterceptorConfigs'");
return interceptorConfigs;
}

public void addInterceptorConfig(final String configName, final String configValue) {
System.out.printf("Calling method 'addInterceptorConfig' with params configName = %s, configValue=%.\n",configName, configValue);
interceptorConfigs.put(configName, configValue);
}

}

控制台输出 theAction 被点击时。

Calling 'intercept' method. 

最佳答案

在您的自定义拦截器中,您可以定义如下图

private final Map<String, String> interceptorConfigs = new HashMap<String, String>();

public Map<String, String> getInterceptorConfigs() {
return interceptorConfigs;
}


public void addInterceptorConfig(final String configName, final String configValue) {
interceptorConfigs.put(configName, configValue);
}

然后在你的 Action 映射中你可以传递如下参数..这些将被存储在拦截器的映射中

    <action name="yourAction" class="your.actionClass">
<result name="success">some.jsp</result>
<interceptor-ref name="defaultStack">
<param name="yourInterceptor.interceptorConfigs.key">value</param>
<param name="yourInterceptor.interceptorConfigs.aParamName">paramValue</param> </interceptor-ref>
</action>

“yourInterceptor”指的是您在将拦截器添加到struts.xml 时提供的拦截器名称。当像上面那样配置时,拦截器内部的“interceptorConfigs”映射将具有 , 键/值对。

如果您想让这些对您的操作可用,您只需将 map 设置为 ActionContext 中的上下文变量。然后可以在操作中检索它。

关于java - 在 Struts 2 中获取拦截器参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16441028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com