一.状态管理:
将客户端与服务器之间多次交互当做一个整体来看待,并且将多次交互中涉及的数据保存下来,提供给后续的交互进行数据的管理即状态管理。
这里的状态指的是当前的数据,管理指的是在这个多次交互的过程中对数据的存储、修改、删除。
二.状态管理两种常见模式
客户端状态管理技术:将状态保存在客户端,代表性的是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"));
删除状态码:
读取状态码:
状态码时间:
将客户端与服务器之间多次交互当做一个整体来看待,并且将多次交互中涉及的数据保存下来,提供给后续的交互进行数据的管理即状态管理。
这里的状态指的是当前的数据,管理指的是在这个多次交互的过程中对数据的存储、修改、删除。
二.状态管理两种常见模式
客户端状态管理技术:将状态保存在客户端,代表性的是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中可以添加多个Cookie
Cookie 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,删除其中一个Cookie
Cookie[] 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,则返回null
if(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");
}
}