在struts2拦截器中取得cookie

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在struts2拦截器中取得cookie相关的知识,希望对你有一定的参考价值。

我写了一个拦截器,想在拦截器中判断cookie,调同样的方法,在action中能取到cookie,但是在拦截器中取不到,为什么?
速度,在线等。。。

    Struts2中,截取HTTP请求中的Cookie信息是由cookie拦截器(CookieInterceptor)来完成的 — action类可以通过使用cookie拦截器来读取cookie的值。

    cookie拦截器的声明

    由于默认情况下不使用cookie拦截器(不在defaultStack中),因此在struts.xml配置文件中需要对其进行声明:

<action name="Index" class="com.lifelaf.blog.action.ExampleAction">
    <interceptor-ref name="defaultStack" />
    <interceptor-ref name="cookie">
        <param name="cookiesName">exampleKeyName1, exampleKeyName2</param>
        <param name="cookiesValue">*</param>
    </interceptor-ref>
    <result>/exampleResult.jsp</result>
</action>

    如上所示,仅仅声明使用cookie拦截器是不够的,我们还需要对该拦截器的cookiesName参数和cookiesValue参数进行设定。如果不设定cookiesName参数,action类将不会收到任何Cookie:

//CookieInterceptor.java
for (Cookie cookie : cookies) 
    if (cookiesNameSet.contains("*")) 
        populateCookieValueIntoStack(name, value, cookiesMap, stack);
     else if (cookiesNameSet.contains(cookie.getName())) 
        populateCookieValueIntoStack(name, value, cookiesMap, stack);
    

    在之前的struts.xml配置文件实例中,cookiesName参数设定为exampleKeyName1和exampleKeyName2,因此ExampleAction将会收到键为exampleKeyName1和exampleKeyName2的Cookie。有趣的是,只要cookiesName中出现*(比如:exampleKeyName1, *, exampleKeyName2),那么action类将会收到所有的Cookie。

    而对于cookiesValue,我们可以用它来设定可接受的Cookie的值。如果cookiesValue未设定,或者cookiesValue中包含*,那么所有name属性符合cookiesName参数设定的Cookie都会被action收到。


    ValueStack声明

    除了在struts.xml配置文件中声明cookie拦截器及其参数,cookie拦截器的使用还需要一个条件:ValueStack中必须包含cookiesName参数中所设定的那些属性;否则当截取Cookie的时候Struts2会抛异常(”No object in the CompoundRoot has a publicly accessible property named …”)。这是因为在截取Cookie的时候CookieInterceptor会尝试往ValueStack中写入cookie信息:

protected void populateCookieValueIntoStack(String cookieName, String cookieValue, Map<String, String> cookiesMap, ValueStack stack) 
    ...
    stack.setValue(cookieName, cookieValue);

    最简单的满足这一条件的方法就是往action类中添加以cookiesName参数为名称的bean。还是以之前的ExampleAction为例,只要在该类中添加以下两个java bean即可:

public class ExampleAction extends ActionSupport implements CookiesAware 
    private Map<String, String> cookiesMap;
    @Override
    public void setCookiesMap(Map<String, String> cookiesMap) 
        this.cookiesMap = cookiesMap;
    

    至此,action类可以通过访问这些bean来读取Cookie的信息。

参考技术A 给拦截器实现ServletRequestAware接口,然后添加一个HttpServletRequest属性(比如就叫request),重写以下方法
public void setServletRequest(HttpServletRequest request)
this.request = request;

然后就通过这个request获取到cookie了
如果你把request写成了private什么的,还可以提供一个get方法,你试试,我这么写过action,但是没这么写过拦截器。本回答被提问者和网友采纳
参考技术B 输出点东西,看自定义拦截器有没有被执行 。 参考技术C 拦截器不起作用

Struts2:在Struts2拦截器中重写URL

我想在执行一个动作之后将一个参数附加到URL,即在拦截器中。

我该怎么做呢?

在这里,在struts.xml

     <action name="reviewpolist" class="purchaseOrderAction" method="getReviewPOList">
         <result name="success">reviewpolist.jsp </result>
     </action>

我目前的网址是 -

localhost":8080/FLO_OSIII/po/jsp/reviewpolist.action?s=185366951

现在我想将参数GetFlg=1添加到URl中,

localhost:8080/FLO_OSIII/po/jsp/reviewpolist.action?s=185366951&GetFlg=1

行动执行后。行动 -

public String getreviewpolist()throws Throwable{    

    //  here my processing code.
    return SUCCESS;

}
答案

要在网址中添加参数,您应该使用s:url标记构建网址,或使用允许您以编程方式执行的UrlHelper。例如

<s:url action="reviewpolist" includeParams="get">
    <s:param name="GetFlg" value="%{'1'}" />
</s:url>

以上是关于在struts2拦截器中取得cookie的主要内容,如果未能解决你的问题,请参考以下文章

Struts加入拦截器后取不到页面参数

struts2 之 struts2拦截器

Struts2拦截器

struts2拦截器

Struts2:在Struts2拦截器中重写URL

struts2 拦截器