Cookie
Posted 10000miles
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cookie相关的知识,希望对你有一定的参考价值。
- 什么是cookie
Cookie可以看作是容器中的一个工具类,只是封装了一些头部有关的属性,单独择出来封装为一个类(我自己的理解)也可以从会话概念入手:就像日常的会话一样,话题进行的每个阶段必然都会产生一些状态或flag,作为会话进行的依据。session和cookie就是用来在会话双方保存这些flag的对象。
(其实也完全可以自己写一个javabean用来作为该对象,但是这样不能保证通用性,且还要在页面中被传来传去,既然是服务器当然就做一些周全的服务,规范和标准,抽象程度越高通用性就越高;也可以使用数据库,想一想将会增加多少连接次数)
- cookie应用代码
结构目录:
login.java
package com.example.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //服务端并不保存cookie对象,仅仅是封装了头部一个属性,在发送和获取时使用该封装 public class Login extends HttpServlet{ private static final long serialVersionUID = 5028881790713553760L; public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); res.setCharacterEncoding("utf-8"); String name = req.getParameter("username"); System.out.println("登陆成功,省略跳转首页,用户名是:"+name); Cookie cookie = new Cookie("username",name); res.addCookie(cookie);//下面随便发送一些内容给浏览器;当客户端已存在cookie时也可以jsp中req无如何访问cookie,但是根据mvc设计理念jsp中不应该访问!! res.getWriter().println("你好cookie小甜饼已经送达请允许浏览器接受保存,只要你访问该地址时,浏览器会找到匹配的cookie作为请求状态发送给我,我就知道你是谁了"); } }
只要在描述符中填充该对应标签,就可以访问了,由容器提供给res一个cookie对象,它封装了响应首部的会话部分,跟随响应发送给客户端,测试后查看浏览器控制台:响 应首部中携带着setcookie,浏览器会把其保存在硬盘或内存中,以后的请求中,只要用户不强制清除缓存或者关闭浏览器、cookie失效等,访问该地址时请求首部都会携带 该cookie信息。下面的程序是获取cookie,因为同属一个应用,所以可以获取到。
havaCookie.java:
package com.example.web; import java.io.IOException;import java.net.HttpCookie; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //首先登陆案例,系统需要一直时登陆状态!也可以假设其是过滤器,每个sev执行之前都要进行过滤判断 public class havaCookie extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException{ res.setCharacterEncoding("utf-8"); res.setContentType("text/html"); Cookie[] ck = req.getCookies();//应用可能给客户端许多ck对象,我们 if(ck == null) {//未登陆,进入登陆页面(重定向模拟一下即可!) res.sendRedirect("login.do?username=‘xiaolifeidao‘"); System.out.println("打印说明cookie为null"); }else {//已登陆,重置失效时长,并重定向到请求地址,这里不获取地址,直接指定一个 System.out.println("进来说明cookie非null"); for(int i=0;i<ck.length;i++) { Cookie cook = ck[i]; System.out.println("打印说明程序在便利cookie"); if(cook.getName().equals("username")){ String username = cook.getValue(); System.out.println("是登陆状态,过滤器已经获取到cookie:"+username); res.sendRedirect("process.do?username=xiaolifeidao"); cook.setMaxAge(10); //查看cookie的其他属性,测试一下 System.out.println("下面是ck的domain:"+cook.getDomain()+"ck的maxage"+cook.getMaxAge() +"ck的有效路径"+cook.getPath()+"版本"+cook.getVersion()); } } } res.getWriter().println("程序已经执行完毕!"); } }
上面的程序是对cookie的获取,当用户浏览器已经保存了cookie信息后,只要之前的前提条件成立发送中都携带请求,测试请求该地址,浏览器控制台中会发现该请求携带 首部携带者cookie信息,然后程序中req就可以的到解析出来的cookie对象。值得注意的是:getcookies获取的是一个数组,因次需要遍历查找。这个程序可以假想为登陆合 法验证程序或者过滤器(虽然里面并没有这部分逻辑代码),验证合法后重定向到另一个程序(设想为欢迎页面或首页,或一个具体的应用逻辑),这样一个会话过程就开 始了。
Process.java:
package com.example.web; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Process extends HttpServlet{ private static final long serialVersionUID = 2856962985282606619L; public void doGet(HttpServletRequest req,HttpServletResponse res){ System.out.println(req.getParameter("username")+"已经付款成功!"); } }
总结:cookie是不保存在服务端的,它只是对首部的封装,在没有其他内容了,这就是cookie,具体方法略去不表,了解其本质的前提下在应用中具体发挥就可以了。
以上是关于Cookie的主要内容,如果未能解决你的问题,请参考以下文章