
Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于Cookie是服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码则可以通过cookie来实现。
有一个专门 *** 作Cookie的类javaxservlet>
如果你要在servlet的init方法中传递值给session,然后在cookie有效范围内使用session中保存的值,可以采用的方法是:首先把attribute放入到servletcontext中,然后在servlet的service或者doXXX方法中再把这些attribute放入到session中。在init方法中不能直接访问session。
步骤如下:
1、在init方法中调用servletconfig的getServletContext()方法,获得ServletContext对象。
2、调用ServletContext对象的setattribute方法放入值
3、在service或者doXXX方法中调用servlet的getServletContext方法,获得ServletContext对象
4、从ServletContext对象中查询需要的值,然后值放入到session中
这个场景通常是用于把webxml文件中配置的参数放入到seesion中。
在servlet中创建Cookie必须遵守RFC 2109规范。规范对于cookie name的原文描述如下:The name must conform to RFC 2109 That means it can contain only ASCII alphanumeric characters and cannot contain commas, semicolons, or white space or begin with a $ character 大致中文含义就是name只能是ascii字符并且不能包含逗号,分号,空格,同时不能以$开头。这是cookie的标准,和你servlet的request/response用什么编码没有任何关系
Struts2中,截取>
cookie拦截器的声明
由于默认情况下不使用cookie拦截器(不在defaultStack中),因此在strutsxml配置文件中需要对其进行声明:
<action name="Index" class="comlifelafblogactionExampleAction"><interceptor-ref name="defaultStack" />
<interceptor-ref name="cookie">
<param name="cookiesName">exampleKeyName1, exampleKeyName2</param>
<param name="cookiesValue"></param>
</interceptor-ref>
<result>/exampleResultjsp</result>
</action>
如上所示,仅仅声明使用cookie拦截器是不够的,我们还需要对该拦截器的cookiesName参数和cookiesValue参数进行设定。如果不设定cookiesName参数,action类将不会收到任何Cookie:
//CookieInterceptorjavafor (Cookie cookie : cookies) {
if (cookiesNameSetcontains("")) {
populateCookieValueIntoStack(name, value, cookiesMap, stack);
} else if (cookiesNameSetcontains(cookiegetName())) {
populateCookieValueIntoStack(name, value, cookiesMap, stack);
}
}
在之前的strutsxml配置文件实例中,cookiesName参数设定为exampleKeyName1和exampleKeyName2,因此ExampleAction将会收到键为exampleKeyName1和exampleKeyName2的Cookie。有趣的是,只要cookiesName中出现(比如:exampleKeyName1, , exampleKeyName2),那么action类将会收到所有的Cookie。
而对于cookiesValue,我们可以用它来设定可接受的Cookie的值。如果cookiesValue未设定,或者cookiesValue中包含,那么所有name属性符合cookiesName参数设定的Cookie都会被action收到。
ValueStack声明
除了在strutsxml配置文件中声明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) {
stacksetValue(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) {
thiscookiesMap = cookiesMap;
}
}
至此,action类可以通过访问这些bean来读取Cookie的信息。
以上就是关于Cookie对象全部的内容,包括:Cookie对象、cookie是什么有什么用cookie详解,一篇文章彻底搞懂cookie、熟悉servlet中init()方法以及session的创建和获取的请进等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)