2013-04-05 100 views
2

我打算编写一个拦截器,在响应中添加一些头文件。目前,我有以下拦截在Struts2拦截器中接收不可预知的参数

public class CachingInterceptor extends AbstractInterceptor{ 

    @Override 
    public String intercept(ActionInvocation ai) throws Exception { 
     HttpServletResponse response = (HttpServletResponse) getActionContext(ai).get(StrutsStatics.HTTP_RESPONSE); 
     if(null != response) { 
      response.setHeader("Cache-control","no-store,no-cache"); 
      response.setHeader("Pragma","no-cache"); 
      response.setHeader("Expires","-1"); 
     } 
     return ai.invoke(); 
    } 
} 

我需要提高它在头可以在配置文件中定义这样一种方式(struts.xml

.... 
<!-- Define and add following interceptor in default interceptor stack --> 
<interceptor name="CachingInterceptor" class="demo.CachingInterceptor"> 
.... 

<action name="myAction" class="demo.myAction"> 
    .... 
<param name="Cache-control">no-store,no-cache</param> 
<param name="Pragma">no-cache</param> 
<param name="Expires">-1</param> 
    .... 
</action> 

现在,我已经在我的拦截器类中定义的属性获取标头值

private String pragma;  //with getter, setter 
private String expires; //with getter, setter 

这里我有两个问题。

1•我无法在java中定义属性“Cache-control”。

2•标题名称是不可预测的,即任何标头可以在配置中被定义为

<param name="other-header">some-value</param> 

我有两个问题:

  • 我怎么能接受在Struts2配置中定义的拦截任何头。
  • 有没有更好的方法来做这件事?
+0

WTQ?您在拦截器放置的静态参数中接收标题。什么是更好地满足您的要求。所描述的 – 2013-04-05 09:08:39

+0

,我想定义HTTP头,同时在配置中映射动作。 – 2013-04-05 13:10:00

回答

1

通过操作配置,您已经定义了几个静态参数,这些参数通过staticParams拦截器进行处理。这个拦截器应该先在堆栈中进行。然后,您只需从行动上下文中检索它们。

Map<String, Object> params = ActionContext.getContext().getParameters(); 
response.setHeader("Cache-control", ((String[])params.get("Cache-control"))[0]); 
response.setHeader("Pragma", ((String[])params.get("Pragma"))[0]); 
response.setHeader("Expires", ((String[])params.get("Expires"))[0]); 
+0

Thanks'Roman C',这个答案提供了解决问题的关键。当我找到一些时间来处理它时,我会在稍作修改后更新答案。 – 2013-04-09 03:55:31