状态管理--Cookie
来源:互联网 发布:c语言的应用领域 编辑:程序博客网 时间:2024/06/06 00:10
1、为什么需要状态管理
在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
2、什么是状态管理
将客户端与服务器之间 多次交互(一次请求,一次响应)当作一个
整体来看待并且将多次交互所涉及的数据即状态保存下来
状态指的是数据
管理指的是多次交互时对数据的修改
3、什么是Cookie
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
4、如何创建Cookie
Cookie c=new Cookie(String name,String value);response.addCookie(c);name:用于区分不同Cookie的名字value:Cookie的值
5、如何查询Cookie
获取客户端的所有Cookie对象
Cookie[] request.getCookies();注:该方法可能放回null获取一个Cookie对象的名称或值:String Cookie.getName();String Cookie.getValue();
6、如何修改Cookie
step1:获取客户端发送的所有Cookie
step2:根据name找到要修改的Cookie
step3:调用Cookie的setValue(String nameValue)方法修改该Cookie的值
Step4:将修改后的Cookie加入到response发送会客户端
7、Cookie的生存时间
Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。
如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。
Cookie cookie = new Cookie(“username”,”helloweenvsfei”); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE
response.addCookie(cookie); // 输出到客户端
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。
如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,
例如:
Cookie cookie = new Cookie(“username”,”helloweenvsfei”); // 新建Cookie
cookie.setMaxAge(0); // 设置生命周期为0,不能为负数
response.addCookie(cookie); // 必须执行这一句
response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。
要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。
注意:从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期
8、Cookie编码与解码
编码:
Cookie只能保存合法的ASCII字符。如果要保存中文,需要将中文转换成合法的ASCII字符,即编码。
Cookie c=new Cookie("city",URLEncoder.encode("北京",“utf-8”))
解码:
编码后的Cookie为了看到中文,需要还原再显示
URLDecoder.decode(value,"utf-8");
9、Cookie路径问题
domain属性决定运行访问Cookie的域名,而path属性决定允许访问
Cookie的路径(ContextPath)。例如,如果只允许/sessionWeb/下的程序使用Cookie,可以这么写:
Cookie cookie = new Cookie(“time”,”20080808”); // 新建Cookie
cookie.setPath(“/session/”); // 设置路径
response.addCookie(cookie); // 输出到客户端
设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾。name相同但domain相同的两个Cookie也是两个不同的Cookie。
注意:页面只能获取它属于的Path的Cookie。例如/session/test/a.jsp
不能获取到路径为/session/abc/的Cookie。使用时一定要注意。
实例一、创建Cookie
1)创建Cookie
package web;import java.io.IOException;import java.io.PrintWriter;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;public class AddCookieServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); Cookie c = new Cookie("username", "king"); Cookie c2 = new Cookie("city", URLEncoder.encode("北京","utf-8")); response.addCookie(c2); response.addCookie(c); pw.close(); }}
2)查找Cookie
<% Cookie[] cookies = request.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { Cookie c = cookies[i]; String name=c.getName(); String value=c.getValue(); out.println(name+""+value); } }%>
运行结果
- 状态管理-Cookie
- 状态管理-Cookie
- cookie状态管理
- 状态管理---cookie、session
- 状态管理--Cookie
- 状态管理-cookie
- 状态管理-cookie
- 状态管理之cookie详解
- JSP状态管理之cookie
- SERVLETJSP Unit06: 状态管理-cookie
- 状态管理——Cookie
- ASP.NET状态管理之五(Cookie)
- ASP.NET状态管理之一:Cookie
- JSP中使用cookie完成状态管理
- C#状态管理(Application、Session、Cookie)
- 深入剖析web的状态管理-Cookie
- ASP.NET 状态管理(cookie、Session)
- C#状态管理(Application、Session、Cookie)
- windows ubuntu 双系统
- POJ2388-Who's in the Middle
- VS2012 配置opencv2.4.9
- MySQL 01 SQL概述
- MySQL 02 数据处理之查询
- 状态管理--Cookie
- ZOJ1104-Leaps Tall Buildings
- PYthon -网络编程—TCP编程
- JS学习之表格的排序简单实例
- 操作系统ucore lab3实验报告
- 剑指offer-面试题47-不用加减乘除做加法
- 如何将 Java Web 项目上传到linux
- 安装Anaconda科学计算包
- Django杂七杂八