Cookie对象

Cookie对象,第1张

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:

//CookieInterceptorjava

for (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的创建和获取的请进等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9308113.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存