Java Web 学习笔记之四:Cookie介绍及使用
来源:互联网 发布:网络部各人员提成方案 编辑:程序博客网 时间:2024/05/21 15:32
简介
Http协议是无状态的协议,但是很多情况下web应用都需要跟踪用户的状态,比如网购平台需要知道请求发送方的登录状态等等。因此需要一种机制来实现无状态的Http协议下的有状态传输。
这种机制就叫做Cookie机制。
Cookie 在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥作用 (此种 Cookies 称作 Session Cookies),一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上,此种Cookies称作Persistent Cookies。
通常情况下,当用户结束浏览器会话时,系统将终止所有的 Cookie。当 Web 服务器创建了Cookies 后,只要在其有效期内,当用户访问同一个 Web 服务器时,浏览器首先要检查本地的Cookies,并将其原样发送给 Web 服务器。这种状态信息称作“Persistent Client State HTTP Cookie” ,简称为 Cookies。
格式
Cookie实际上是一段文本信息。
服务端向客户端发送cookie在响应头部上的名字叫做Set-Cookie,其包含的内容有:
name 必需,规定cookie值的名称value 必需,规定cookie值的值以上是cookie值expire 可选,规定cookie的有效期path 可选,规定cookie的服务器路径(即哪些路径内生效)domain 可选,规定cookie的域名secure 可选,规定是否通过安全的Https连接进行传输以上是cookie的属性
其中需要注意的是,属性是不需要返回给服务器的。即如果需要带上cookie返回给服务器已达到保持会话等作用,只需要将cookie值返回即可。
而Cookie属性,是给浏览器用来对cookie进行一系列判断操作的依据,比如说失效时间判断等。
Set-Cookie : customer=xxxxxxx; path=/xx/xx; domain=ccc.ccc; expires=Wednesday, 19-OCT-05 23:12:40 GMT; [secure]
Java 封装
在Java web请求发送工具中添加cookie支持,可以实现工具的会话保持功能,下面是封装的cookie类:
import java.util.HashMap;import java.util.Map;/** * Cookie实体类 * * @author Xuyh * */public class Cookie {public final static String COOKIE_ATTRIBUTE_NAME_EXPIRE = "expire";public final static String COOKIE_ATTRIBUTE_NAME_PATH = "path";public final static String COOKIE_ATTRIBUTE_NAME_DOMAIN = "domain";public final static String COOKIE_ATTRIBUTE_NAME_SECURE = "secure";public final static String COOKIE_ATTRIBUTE_NAME_HTTPONLY = "HttpOnly";public final static String COOKIE_ATTRIBUTE_NAME_HTTPONLY_LOWERCASE = "httponly";/** * cookie的有效值 */private Map<String, String> cookieValue = new HashMap<String, String>();/** * cookie的有效期 */private String expire = "";/** * cookie生效的服务器路径 */private String path = "";/** * cookie的域名 */private String domain = "";/** * 是否通过安全的HTTPS连接来传输cookie */private boolean secure = false;private boolean HttpOnly = false;/** * 从服务器获得的Set-Cookie字串解析成Cookie对象 * * @param set_cookie * @return Cookie对象 */public static Cookie newCookieInstance(String set_cookie) {Cookie cookie = new Cookie();String[] params = set_cookie.split("; ");for (String param : params) {if (param.toLowerCase().contains(COOKIE_ATTRIBUTE_NAME_PATH)) {cookie.setPath(param.substring(param.indexOf("=") + 1));} else if (param.toLowerCase().contains(COOKIE_ATTRIBUTE_NAME_DOMAIN)) {cookie.setDomain(param.substring(param.indexOf("=") + 1));} else if (param.toLowerCase().contains(COOKIE_ATTRIBUTE_NAME_EXPIRE)) {cookie.setExpire(param.substring(param.indexOf("=") + 1));} else if (param.toLowerCase().contains(COOKIE_ATTRIBUTE_NAME_SECURE)) {cookie.setSecure(true);} else if (param.toLowerCase().contains(COOKIE_ATTRIBUTE_NAME_HTTPONLY_LOWERCASE)) {cookie.setHttpOnly(true);} else {String[] nameAndValue = param.split("=");cookie.addCookieValue(nameAndValue[0], nameAndValue[1]);}}return cookie;}/** * 获取服务器发送客户端的set-cookie字串 * * @return */public String convertCookieToCookieSetString() {String Set_Cookie = "";String cookieValueString = "";for (String name : this.cookieValue.keySet()) {cookieValueString += ("; " + name + "=" + this.cookieValue.get(name));}cookieValueString = cookieValueString.substring(2);Set_Cookie += cookieValueString;if (this.path != null && !this.path.equals("")) {Set_Cookie += ("; " + COOKIE_ATTRIBUTE_NAME_PATH + "=" + this.path);}if (this.domain != null && !this.domain.equals("")) {Set_Cookie += ("; " + COOKIE_ATTRIBUTE_NAME_DOMAIN + "=" + this.domain);}if (this.expire != null && !this.expire.equals("")) {Set_Cookie += (";" + COOKIE_ATTRIBUTE_NAME_EXPIRE + "=" + this.expire);}if (this.secure) {Set_Cookie += ("; " + COOKIE_ATTRIBUTE_NAME_SECURE);}if (this.HttpOnly) {Set_Cookie += ("; " + COOKIE_ATTRIBUTE_NAME_HTTPONLY);}return Set_Cookie;}/** * 添加cookie值 * * @param name * @param value */public void addCookieValue(String name, String value) {this.cookieValue.put(name, value);}/** * 获取cookie值的字串 * * @return */public String convertCookieToCookieValueString() {String cookieValueString = "";for (String name : this.cookieValue.keySet()) {cookieValueString += ("; " + name + "=" + this.cookieValue.get(name));}cookieValueString = cookieValueString.substring(2);return cookieValueString;}public Map<String, String> getCookieValue() {return cookieValue;}public void setCookieValue(Map<String, String> cookieValue) {this.cookieValue = cookieValue;}public String getExpire() {return expire;}public void setExpire(String expire) {this.expire = expire;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public String getDomain() {return domain;}public void setDomain(String domain) {this.domain = domain;}public boolean isSecure() {return secure;}public void setSecure(boolean secure) {this.secure = secure;}public boolean isHttpOnly() {return HttpOnly;}public void setHttpOnly(boolean httpOnly) {HttpOnly = httpOnly;}}
定义好cookie的封装类之后,可以通过以下代码来获取服务器响应的cookie:
Cookie cookie;URL url = new URL(actionURL);httpURLConnection = (HttpURLConnection) url.openConnection();String set_cookie = connection.getHeaderField("Set-Cookie");cookie = Cookie.newCookieInstance(set_cookie);
以及通过以下代码来发送cookie给服务端:
URL url = new URL(actionURL);httpURLConnection = (HttpURLConnection) url.openConnection();connection.setRequestProperty("cookie", cookie.convertCookieToCookieValueString());
0 0
- Java Web 学习笔记之四:Cookie介绍及使用
- Java Web学习笔记(四)
- Java.Web学习笔记 Cookie Session
- java web 学习笔记四 使用ajax响应异步请求
- java for Web学习笔记之Servlet的使用及注意事项
- JAVA学习笔记之四
- Java Web学习笔记(四)servlet
- android学习笔记之利用AsyncHttpClient实现登录及cookie使用
- android学习笔记之利用AsyncHttpClient实现登录及cookie使用
- Java并发学习之ThreadLocal使用及原理介绍
- 学习笔记之cookie
- Java web Filter的介绍及使用
- JAVA WEB学习笔记(一)-Cookie和Session专题
- JAVA WEB学习笔记-Cookie和Session专题
- JAVA WEB学习笔记(一)-Cookie和Session专题
- JAVA WEB学习笔记(一)-Cookie和Session专题
- JAVA WEB学习笔记(一)-Cookie和Session专题
- JAVA WEB学习笔记(一)-Cookie和Session专题
- 实现简单的拨打电话功能实现一键拨号实例
- ScrollView去掉半月阴影
- Apache配置虚拟域名
- win10 vs2015 openssl-1.0.2j编译
- TCP/IP协议栈初始化(六) 终于见到IP
- Java Web 学习笔记之四:Cookie介绍及使用
- 模拟TCP传输的客户端和服务端
- 从文件中播放视频 VideoCapture_read_avi.py
- 利用积性函数实现的各种线性筛法
- shell变量的输出替换截取等操作
- javascript/jquery/html/css工作总结
- cv2.VideoWriter.write.py 保存视频
- OpenCL、OpenGL和DirectX三者的区别
- Google Sample MVP Android架构蓝图