struts2使用cookie详解
-
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的信息。