目录
一、状态管理
1.1 现有问题
1.2 概念
1.3 状态管理分类
一、状态管理 1.1 现有问题
HTTP协议是无状态的,不能保存每次提交的信息
如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系。
对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就成问题了。
1.2 概念
将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。
1.3 状态管理分类
客户端状态管理技术:将状态保存在客户端。代表性的是cookie技术。
服务器状态管理技术:将状态保存在服务器端。代表性的是session技术(服务器传递sessionID时需要使用cookie的方式)和application
二、cookie的使用 2.1 什么是cookie
cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。
一旦Web浏览器保存了某个cookie, 那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个cookie回传给Web服务器。
一个cookie主要由标识该信息的名称(name) 和值(value) 组成。
2.2 创建cookie
1、创建
package com.ha.cookie;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;public class cookieServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1、服务端创建cookie对象 cookie cookie = new cookie("username", "HuAn"); // 2、将cookie响应给客户端 resp.addcookie(cookie); }}
<?xml version="1.0" encoding="UTF-8"?>
2、查看
运行并访问这个网页
(1)查看方式一:
响应头里面有响应的cookie
(2)查看方式二
3、补充
(1)设置访问路径
(2)设置客户端cookie有效时间
(3)设置多个cookie
2.3 获取cookie
package com.ha.cookie;import javax.servlet.ServletException;import javax.servlet.http.*;import java.io.IOException;import java.net.URLDecoder;public class GetServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.通过request对象获取所有的cookie cookie[] cookies = req.getcookies(); //2.通过循环遍历cookie if(cookies!=null){ for(cookie cookie : cookies){ System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8") +":"+URLDecoder.decode(cookie.getValue(),"UTF-8")); } } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); }}
2.4 修改cookie
只需要保证cookie的名和路径一致即可修改
cookie cookie = new cookie("username", "Tom");cookie.setPath("/myweb");cookie.setMaxAge(60*60);resp.addcookie(cookie);
注意:如果改变cookie的name和有效路径会新建cookie,而改变cookie值、 有效期会覆盖原有cookie
2.5 cookie编码与解码
cookie默认不支持中文,只能包含ASCII字符, 所以cookie需要对Unicode字符进行编码,否则会出现乱码。
编码可以使用java.net.URLEncoder类的encode(String str, String encoding)方法
解码使用java.net.URLDecoder类的decode(String str, String encoding)方法
2.6 cookie优点和缺点
1、优点:
可配置到期规则。
简单性: cookie 是一种基于文本的轻量结构,包含简单的键值对。
数据持久性: cookie默认在过期之前是可以一-直存在客户端浏览器上的
2、缺点:
大小受到限制:大多数浏览器对cookie的大小有4K、8K字 节的限制。
用户配置为禁用:有些用户禁用了浏览器或客户端设备接收cookie的能力,因此限制了这一功能。
潜在的安全风险: cookie 可能会被篡改。会对安全性造成潜在风险或者导致依赖于cookie的应用程序失败。