一、Cookie
1、什么是Cookie
cookie是服务器通知客户端保存键值对的一种技术
客户端有了cookie以后,每次请求都发送给服务器
每个cookie的大小都不能超过4kb
2、如何创建Cookie
1)创建cookie-session的JavaWeb项目-->com.wufq.servelt包-->CookieServlet类、BaseServlet类(导入book已有的)
2)修改web.xml的请求路径
<servlet> <servlet-name>CookieServlet</servlet-name> <servlet-class>com.wufq.servlet.CookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieServlet</servlet-name> <url-pattern>/cookieServlet</url-pattern> </servlet-mapping>
3)修改cookie.html的请求地址
<title>Cookie</title> <base href="http://localhost:8080/cookie_session/"> <style type="text/css"> ul li { list-style: none; } </style> </head> <body> <iframe name="target" width="500" height="500" style="float: left;"></iframe> <div style="float: left;"> <ul> <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li> <li><a href="" target="target">Cookie的获取</a></li> <li><a href="" target="target">Cookie值的修改</a></li> <li>Cookie的存活周期</li>
4)CookieServlet类创建createCookie方法(实现cookie对象的实现)
public class CookieServlet extends BaseServlet{ protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1、创建cookie对象 Cookie cookie = new Cookie("key1", "value1"); //2、通知客户端保存cookie resp.addCookie(cookie); resp.getWriter().write("Cookie创建成功!"); }
5)启动程序以后,测试发现:存在两个问题:
5.1)显示到浏览器上面的中文出现乱码
5.2) cookie可以一次创建多个cookie,并且一定要用response.addCookie(cookie)通知客户端,否则客户端接收不到cookie信息
解决这两个问题的方法:
第一个问题的解决方法:在BaseServlet的doPost请求内加上
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action = req.getParameter("action"); //解决post请求中文乱码问题 //一定要在获取请求参数调用之前执行才有效 req.setCharacterEncoding("UTF-8"); //解决响应中文的乱码问题 resp.setContentType("text/html;charset=UTF-8"); try { // //通过反射获取login,regist方法 Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); //调用方法 method.invoke(this,req, resp); } catch (Exception e) { e.printStackTrace(); } }
第二个问题实现的方式:
在CookieServlet类内多创建几个Cookie对象
Cookie cookie2 = new Cookie("key2", "value2"); resp.addCookie(cookie2); Cookie cookie3 = new Cookie("key3", "value3"); resp.addCookie(cookie3);
验证:响应头Set-cookie保存cookie的键值对
3、cookie的获取
1)服务器获取客户端的Cookie只需要一行代码:req.getCookie():Cookie[]
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for(Cookie cookie : cookies) { /* * * cookie.getName() 获取cookie的key * cookie.getValue() 获取cookie的value */ resp.getWriter().write("Cookie[ "+cookie.getName()+":"+cookie.getValue()+" ]"+"</br>"); } Cookie iWantCookie = CookieUtil.findCookie("key2",cookies); if (iWantCookie != null) { resp.getWriter().write("找到了需要cookie"); } }
除了去获取全部的cookie,在实际项目中还常用cookie的key去查找对应的值==>这种通用的方法一般会写成工具类
cookieUtil类
public class CookieUtil { public static Cookie findCookie(String name,Cookie[] cookies){ if(name == null||cookies==null||cookies.length == 0){ return null; } for(Cookie cookie : cookies) { if (cookie.getName().equals(name)) { return cookie; } } return null; } }
4、修改cookie
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 第一种方式: * 1、创建一个要修改的同名的cookie对象 * 2、在构造器内重新赋值 * 3、把cookie返回给浏览器 */ Cookie cookie = new Cookie("key1", "newValue1"); resp.addCookie(cookie); /* * 第二种方式: * 1、查找到cookie的值 * 2、用setCookie修改 * 3、返回给浏览器 */ Cookie key2 = CookieUtil.findCookie("key2", req.getCookies()); key2.setValue("newValue2"); resp.addCookie(key2); }
5、Cookie的生命控制
指的设置cookie的失效时间
setMaxAge() -->主要由这个方法控制
正数:表示在指定的描述后过期
负数:表示浏览器一关,Cookie就会被删除(默认值是-1)
零:表示马上删除
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("default","default"); cookie.setMaxAge(-1); resp.addCookie(cookie); } protected void nowDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("nowDelete","nowDelete"); cookie.setMaxAge(0); resp.addCookie(cookie); resp.getWriter().write("nowDelete被删除"); } protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("life3600","life3600"); cookie.setMaxAge(30); resp.addCookie(cookie); resp.getWriter().write("life3600"); }
6、cookie有效路径Path设置
cookie的path属性可以有效的过滤那些cookie可以发送给服务器,那些不发
path属性通过请求地址来进行有效的过滤
比如:
cookieA path:/工程名
cookie path: /工程名/abc
请求的地址如下:http://localhost:8080/工程名/a.html
cookieA和CookieB都发送
http://localhost:8080/工程名/abc/a.html
cookieA不发送,CookieB发送
protected void pathCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("path","path"); cookie.setPath(req.getContextPath()+"/abc"); resp.addCookie(cookie); resp.getWriter().write("创建了一个带path路径的cookie"); }
#Cookie练习:免输入用户名登录