Cookie入门
2016-01-04 19:11
309 查看
Cookie入门
基本概述
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie也可以叫做浏览器缓存。因为HTTP是无状态的协议,它不能保存用户状态,这时候往往会用到Cookie技术来对用户进行标识并进行一些特定的处理。服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
参考文档:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html
Cookie原理图
案例:
package com.pc; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author Switch * 功能:设置Cookie */ public class Servlet8 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 字符编码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); // 创建Cookie (api) Cookie cookie = new Cookie("Switch", "123456"); // 设置cookie的生命周期 cookie.setMaxAge(3600); // 把cookie信息会写给浏览器 response.addCookie(cookie); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
package com.pc; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author Switch * 功能:获取Cookie * */ public class Servlet9 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 字符编码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); // 获取客户端发过来的所有cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { // 测试 // System.out.println(cookies.length); for(Cookie c : cookies){ out.println(c.getName() + " " + c.getValue()); } } out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
package com.pc; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author Switch * 功能:测试Cookie同名会发生什么情况 */ public class Servlet10 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 字符编码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); // 创建Cookie (api) Cookie cookie1 = new Cookie("Switch2", "123456"); // 设置cookie的生命周期 cookie1.setMaxAge(3600); // 把cookie信息会写给浏览器 response.addCookie(cookie1); // 同名会后面的会覆盖前面的Cookie Cookie cookie2 = new Cookie("Switch2", "654321"); // 设置cookie的生命周期 cookie2.setMaxAge(3600); // 把cookie信息会写给浏览器 response.addCookie(cookie2); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
小结:
1、cookie是在服务器创建的
2、cookie是保存在浏览器缓存文件中的
3、cookie的生命周期是可设置的
cookie.setMaxAge(time); // time是以秒为单位的
如果不设置setMaxAge则当浏览器关闭时,该cookie就消亡。
4、cookie可以被多个浏览器共享
5、cookie是(名---值)对应关系
name和value都是String型的
如果设置Cookie,name相同,则后设置会覆盖前设置
6、一个web应用中可以保存多个cookie,并且会保存在浏览器缓存文件夹的同一个文件中
7、cookie存放方式是以明文的方式,所以为了安全,要进行加密。
MD5加密算法
package com.pc; import java.security.*; import java.security.spec.*; /** * @author Switch * 功能:MD5加密 */ class MD5_test { public final static String MD5(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { byte[] strTemp = s.getBytes(); MessageDigest mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(strTemp); byte[] md = mdTemp.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { return null; } } public static void main(String[] args) { System.out.print(MD5_test.MD5("Switch")); } }
PS:MD5是一种单向加密方式,其加密是不可逆转的,但是也可能存在破解方法,不过要一定的时间,所以建议采用MD5 64位加密或者是128位加密,该提供的方法只是32位加密方式。
使用Cookie保存用户重要信息时,比如密码、银行账号时,必须要进行加密传输存储。
案例:保存上次登录的时间
package com.pc; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet11 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 字符编码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); // 用Cookie记录上次登录时间 boolean b = false; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { // 获取name String name = cookie.getName(); if ("lasttime".equals(name)) { // 显示时间 out.println("上次登录时间是:" + cookie.getValue()); updateDate(response); b = true; break; } } } if (!b) { out.println("这是您第一次登录"); updateDate(response); } out.flush(); out.close(); } private void updateDate(HttpServletResponse response) { // 更新时间 SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String nowDate = simpleDateFormat.format(new Date()); Cookie c = new Cookie("lasttime", nowDate); // 7天有效期 c.setMaxAge(3600 * 24 * 7); response.addCookie(c); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
cookie生命周期
cookie默认的生命周期是会话级别的,也就是说浏览器一关闭cookie立即失效。可以通过setMaxAge(time)的方法设置生命周期。time | 解释 |
正数 | 设置多少秒后失效 |
0 | 删除该cookie |
负数 | 设置该cookie为会话级别 |
//先得到该cookie Cookie cookies[]=request.getCookies(); for(Cookie cookie: cookies){ if(cookie.getName().equals("id")){ System.out.println("id"); //删除 cookie.setMaxAge(0); //一定带上这句话,否则不能删除 response.addCookie(cookie); } }
PS:如果该web应用只有一个cookie ,则删除该cookie后,在浏览器的临时文件夹下没有该cookie文件,如果该web应用有多个cookie,则删除一个cookie后,文件还在,只是该cookie没有。
cookie细节
1、一个浏览器最多能够存放300个cookie,每个web站点,最多只能占用20个cookie,而且一个cookie大小最大不能超过4k。2、cookie存放中文,有可能会出现乱码的情况,这时可以采用如下方法解决
存放:
String val=java.net.URLEncoder.encode("张三","utf-8");
Cookie cookie=new Cookie("name",val);
取出:
String val=java.net.URLDecoder.decode(cookie.getValue(), "utf-8");
out.println("name ="+val);
----------参考《韩顺平.细说Servlet》
相关文章推荐
- 销毁活动
- 学习Javascript闭包(Closure)
- Win Server2008 服务器远程连接数量设置
- R-Latex sweave 如何隐藏R代码
- db2合并多行数据
- [漫画]程序员的日常生活 62
- [漫画]程序员的日常生活 61
- Hybrid app开发总结
- JavaScript事件处理程序 学习笔记
- java.lang.IllegalStateException: The content of the adapter has changed but ListView..
- (实训第一天)Linux下编译运行C源程序的过程(图解)
- [漫画]程序员的日常生活 60
- [漫画]程序员的日常生活 59
- struts2 s:iterator标签
- 深入分析JavaWeb Item41 -- 邮件的发送与接收原理
- JavaScript事件处理程序 学习笔记
- Makefile笔记整理
- [漫画]程序员的日常生活 58
- 记录遇到的各种rails报错
- mysql不能使用localhost登录