Cookie

来源:互联网 发布:linux ping 显示丢包 编辑:程序博客网 时间:2024/06/03 06:23
一.状态管理:
将客户端与服务器之间多次交互当做一个整体来看待,并且将多次交互中涉及的数据保存下来,提供给后续的交互进行数据的管理即状态管理。
这里的状态指的是当前的数据,管理指的是在这个多次交互的过程中对数据的存储、修改、删除。

二.状态管理两种常见模式
客户端状态管理技术:将状态保存在客户端,代表性的是Cookie技术
服务端状态管理技术:将状态保存在服务端,代表性的是Session技术

三.Cookie原理
1.第一次访问服务器时候通过 Request 对象下发Cookie
2.以后每次浏览器访问同一个网站时候将Cookie放在request中带回来
3.Cookie是在Http请求和响应的头部发送的

四.Cookie的过期时间
1.不设置时间,Cookie会保存到浏览器内存中,在浏览器关闭时候消失
2.设置为0则删除Cookie
3.设置为具体秒数,则Cookie会保存到浏览器端的硬盘上,在下次启动浏览器再次请求网站时候还会带回来Cookie 域名问题

五.Cookie域名问题
默认情况下, Cookie是属于当前网站域名的, 并且浏览器只会将当前域名下的Cookie发送会当前网站.
这样可以一定层面上保障Cookie的安全而问题.Cookie的路径问题

六.Cookie是有路径属性的, Cookie在通过response向服务器发送时候, 根据路径属性选择发送:
父目录Cookie发送给子目录
当前目录的Cookie发送给当前目录
子目录的Cookie不发送给父目录

七.Cookie 仿冒问题
Cookie 是可以被仿冒的!
Cookie 中不能保存”敏感信息”
敏感信息应该采用Session保存
不能保存敏感信息: 密码, 敏感的价格, …
实在需要保存敏感信息, 需要”摘要”或者”加密”
Cookie cookie = new Cookie("demo",URLEncoder.encode("Hello World","utf-8"));
Cookie[] cookies = request.getCookies();
System.out.println(cookie.getName()+":"+URLDecoder.decode(cookie.getValue(), "utf-8"));


发送状态码:

package cn.tedu.tstore.web;import java.io.IOException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 利用 Response 下发Cookie(会员卡)到浏览器端 */public class AddCookieServlet extends HttpServlet {private static final long serialVersionUID = 1L;       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//创建Cookie对象,其中demo是对象的key//Hello World 是对象的值Cookie cookie = new Cookie("demo",URLEncoder.encode("Hello World","utf-8"));//注意: Cookie是在Http头部传送的!只能//采用ISO8859-1编码!//在Response中可以添加多个CookieCookie cookie2 = new Cookie("test",URLEncoder.encode("Hello Kitty","utf-8"));response.addCookie(cookie);response.addCookie(cookie2);//简单响应response.setContentType("text/html");response.getWriter().print("OK");}}

package cn.tedu.tstore.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的path属性 */public class AddCookie2Servlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie c3 = new Cookie("c3", "6");Cookie c4 = new Cookie("c4", "6");Cookie c5 = new Cookie("c5", "6");//不设置属性,则属性就是当前请求路径String path = request.getRequestURI();System.out.println("当前目录:"+path);c3.setPath("/store");//c4设置为相对目录当前目录的子目录demo//c4.setPath("demo");//c5设置为绝对目录"/"就是网站根目录c5.setPath("/");response.addCookie(c3);response.addCookie(c4);response.addCookie(c5);//简单响应response.setContentType("text/html");response.getWriter().print("OK");}}

删除状态码:


package cn.tedu.tstore.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 DeleteCookieServlet extends HttpServlet {private static final long serialVersionUID = 1L;       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取所有Cookie,删除其中一个CookieCookie[] cookies = request.getCookies();if(cookies!=null) {for(Cookie cookie : cookies) {if(cookie.getName().equals("demo")){cookie.setMaxAge(0);response.addCookie(cookie);}}}//简单响应response.setContentType("text/html");response.getWriter().print("OK");}}

读取状态码:

package cn.tedu.tstore.web;import java.io.IOException;import java.net.URLDecoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 从Request中读取浏览器发送来的Cookie */public class ReadCookieServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//request提供了读取全部Cookie的方法Cookie[] cookies = request.getCookies();//如果没有cookie,则返回nullif(cookies!=null) {for(Cookie cookie : cookies) {System.out.println(cookie.getName()+":"+cookie.getValue()+":"+cookie.getDomain());//getDomain()是获取该cookie的域名System.out.println(cookie.getName()+":"+URLDecoder.decode(cookie.getValue(), "utf-8"));}}//简单响应response.setContentType("text/html");response.getWriter().print("OK");}}

状态码时间:

package cn.tedu.tstore.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;/** * Servlet implementation class CookieAgeServlet */public class CookieAgeServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie c1 = new Cookie("t1","5");Cookie c2 = new Cookie("t2","5");//设置Cookie的过期时间,其默认值是当前//浏览器打开期间有效c2.setMaxAge(60*60*24);response.addCookie(c1);response.addCookie(c2);//简单响应结果response.setContentType("text/html");response.getWriter().print("OK");}}


原创粉丝点击