struts2使用cookie详解

本文介绍如何在Struts2框架中通过CookieInterceptor截取HTTP请求中的Cookie信息。需在struts.xml中声明并设置cookiesName及cookiesValue参数,并确保ValueStack中包含相应属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  • cookie拦截器的声明

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

1
2
3
4
5
6
7
8
< 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:

1
2
3
4
5
6
7
8
//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信息:

1
2
3
4
protected  void  populateCookieValueIntoStack(String cookieName, String cookieValue, Map<String, String> cookiesMap, ValueStack stack) {
     ...
     stack.setValue(cookieName, cookieValue);
}
  • 最简单的满足这一条件的方法就是往action类中添加以cookiesName参数为名称的bean。还是以之前的ExampleAction为例,只要在该类中添加以下两个java bean即可:

1
2
3
4
5
6
7
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的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值