在struts2拦截器中取得cookie

我写了一个拦截器,想在拦截器中判断cookie,调同样的方法,在action中能取到cookie,但是在拦截器中取不到,为什么?速度,在线等。。。... 我写了一个拦截器,想在拦截器中判断cookie,调同样的方法,在action中能取到cookie,但是在拦截器中取不到,为什么?
速度,在线等。。。
展开
 我来答
堵寄灵kO
2015-11-10 · TA获得超过2370个赞
知道小有建树答主
回答量:588
采纳率:100%
帮助的人:471万
展开全部
  • 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的信息。

一眼万万年_
2011-09-17 · TA获得超过1355个赞
知道小有建树答主
回答量:310
采纳率:0%
帮助的人:171万
展开全部
给拦截器实现ServletRequestAware接口,然后添加一个HttpServletRequest属性(比如就叫request),重写以下方法
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
然后就通过这个request获取到cookie了
如果你把request写成了private什么的,还可以提供一个get方法,你试试,我这么写过action,但是没这么写过拦截器。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
longturong
2011-09-17 · TA获得超过2083个赞
知道小有建树答主
回答量:153
采纳率:0%
帮助的人:165万
展开全部
输出点东西,看自定义拦截器有没有被执行 。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
86596net
2011-09-17 · TA获得超过157个赞
知道答主
回答量:286
采纳率:100%
帮助的人:174万
展开全部
拦截器不起作用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式