java之Cookie详解

Cookie 是由服务器端生成,发送给 User-Agent (一般是浏览器),浏览器会将 Cookie key/value 保存到某个目录下的文本文件内,下次请求同一网站时就发送该 Cookie 给服务器(前提是浏览器设置为启用 cookie )。 Cookie 名称和值可以由服务器端开发自己定义,对于 JSP 而言也可以直接写入 JSESSIONID 用于标记一个会话 (session) ,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取 Cookies 中包含信息,借此维护用户跟服务器会话中的状态。

Cookie 是客户端技术,而 HttpSession 是服务器端技术。

java Cookie 详细介绍 :

1 Cookie 是什么?

一个小信息,由服务器写给浏览器的。由浏览器来保存。

客户端保存的 Cookie 信息,可以再次带给服务器。

Cookie 类: javax.servlet.http.Cookie

2 Cookie 的属性:

name :必须的

value :必须的

comment :可选的。注释

path : 可选的,如果不设置路径,那么只有设置该 cookie URI 及其子路径可以访问

Cookie 的程序的访问路径是: http://localhost:8080/JavaWeb/servlet/CookieDemo

其中: localhost 就是域名; /JavaWeb/servlet 就是当前 Cookie path
若访问的地址的 URI 包含着 cookie 的路径,即 URI.startWith(cookie 的路径 ), true ,则客户端将该 cookie 带给服务器。
比如浏览器存的 cookie 的路径是 /JavaWeb
现在访问的地址是: http://localhost:8080/JavaWeb/servlet/CookieDemo   则带该 cookie
现在访问的地址是: http://localhost:8080/JavaWeb/CookieDemo   则带该 cookie
若浏览器存的 cookie 的路径是 /JavaWeb/servlet/
访问的地址是: http://localhost:8080/JavaWeb/servlet/CookieDemo    则带该 cookie
访问的地址是: http://localhost:8080/JavaWeb/CookieDemo    则不带该 cookie
如果一个 cookie 的路径设置成了 /JavaWeb ,意味着浏览器访问当前应用下的所有资源时都会带着该 cookie 给服务器。

domain :可选的。该 Cookie 所属的网站域名。( apache.org )默认值。

maximum age :可选的。不设置就是会话过程(存在浏览器的内存中)。单位是秒
如果是 0 ,说明要删除。

version :可选的。

3 、如何向客户端写 Cookie

HttpServletResponse 对象 .addCookie(javax.servlet.http.Cookie 对象 ) (就是写了一个响应消息头: Set-Cookie:cookie 的信息)

Servlet 规范中的 Cookie API 提供了 setMaxAge  setPath setDomain 等方法,可以对 Cookie 状态进行控制

特点:一个浏览器针对一个网站最多存 20 Cookie ;最多存 300 Cookie ,每个 Cookie 的长度不能超过 4KB (稀缺)。只是规定,但不同的浏览器实现的不同。

1     public void doGet(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3         Cookie cookie=new Cookie("name","Tom");
 4         //设置Maximum Age
 5         cookie.setMaxAge(1000);
 6         //设置cookie路径为当前项目路径
 7         cookie.setPath(request.getContextPath());
 8         //添加cookie
 9         response.addCookie(cookie);
10     }

4 、服务器如何得到客户端传来的 Cookie

Java 中利用 Serlvet 或者 JSP scriptlet 可以向浏览器端写入 Cookie ,同样,利用 Servet 或者 JSP scriptlet 也可以读取到 Cookie 信息

Servlet 规范中的 Cookie API  同样存在 getMaxAge  getPath  getDomain 等方法,可以获得相应的状态。

不过此处存在一个问题:

读取 Cookie 时,发现除了 Cookie key value 外,其他值获取都为 null

原因很简单: Cookie 从服务器端发送到客户端时,信息是完整的, Cookie 从客户器端发送到服务端时,信息只剩下 key value 了。 ( 因为 Domain 不对的 Cookie Path 不对的 Cookie 、过期的 Cookie ,客户端是不会发送过来的 )

那为什么 Java 中提供了相应的 get 方法呢? 那个方法其实是在生成 Cookie 后,尚未发送到客户端时使用的

服务器端通过 HttpServletRequest 对象 .getCookies() 可获取 cookies 数组。

1     public void doGet(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3         PrintWriter out=response.getWriter();
 4         Cookie[] cookies=request.getCookies();
 5         if(cookies!=null){
 6             for(Cookie cookie:cookies){
 7                 String name=cookie.getName();
 8                 String value=cookie.getValue();
 9                 out.write(name+"="+value);
10             }
11         }
12     }

5 、如何区分 Cookie

通过名称不行 , 应通过 domain+path+name 来区分的。

全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务