1. 会话:一次会话中包含多次请求和响应。
* 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能:在一次会话的范围内的多次请求间,共享数据
3. 方式:
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
是一个客户端状态保持机制,用来存储用户特定的信息。当用户再次访问时,应用程序可以检索以前的存储细信息。
由图片可知 ☟
1.Cookie 中存储的一段文本信息,是关于网站相关的文本字符串数据。
2.Cookie 中的存储方式两种:
1.指定了过期时间,保存在本地硬盘上,设置了某网站过期时间,在指定时间内访问,那么属于该网站的Cookie数据会在请求报文中发送过来。
2.没有指定过期时间,存储在浏览器内存中。
登录页面有一个下次自动登陆、几天内免登陆等。可以通过Cookie记录用户已经登录,这样用户不需要每次都输入凭据。
购物车,添加购物信息。
例如要开始博主选拔了,让大家投票,可以将Cookile作为一个Boolean值,用来指示用户是否已经投票,这样用户就无法第二次进行投票。
1.Cookie创建与基本属性
//创建Cookile
Response.Cookies["fjx"].Value = "itcast";
//给创建的Cookile指定过期时间
Response.Cookies["fjx"].Expires = DateTime.Now.AddDays(1);
2.删除Cookile,给他赋值一个过期的时间
Response.Cookies["fjx"].Expires = DateTime.Now.AddDays(-1);
3.Cookie跨域(域名):Domain属性
//创建Cookile
Response.Cookies["fjx"].Value = "itcast";
//设置主域
Response.Cookies["fjx"].Domain= "xxx.com";
4.有的时候用户通常禁用Cookie,所以我们需要判断用户是否禁用
protected void Page_Load(object sender, EventArgs e)
{
string redirect = Request.QueryString["redirect"];
string acceptsCookies;
if(Request.Cookies["TestCookie"] ==null)
acceptsCookies = "no";
else
{
acceptsCookies = "yes";
// Delete test cookie.
Response.Cookies["TestCookie"].Expires =DateTime.Now.AddDays(-1);
}
Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies,true);
}
5. Cookie的特点和作用
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
* 作用:
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
例子:
//需求分析:登陆时,默认记住账号和密码
public partial class WebForm1 : System.Web.UI.Page
{
public string LoginUserName { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack)
{ //如果是post请求
string userName = Request.Form["txtName"];//接收用户输入的信息
Response.Cookies["userName"].Value = Server.UrlEncode(userName);//创建一个Cookile,如果存取的中文,需要进行一下编码
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);//设置Cookile中数据保存时间为一周
}
else
{
//此时为Get请求,需要读取Cookile
if (Response.Cookies["userName"] != null)
{
string name = Server.UrlDecode(Response.Cookies["userName"].Value) ;//接收用户输入的信息(进行反编码)
LoginUserName = name;
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);//获取用户数据后,再次保存7天
}
}
}
}
* 使用步骤:
1. 创建Cookie对象,绑定数据
* new Cookie(String name, String value)
2. 发送Cookie对象
* response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
* Cookie[] request.getCookies()
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c = new Cookie("fjx","itcast");
//2.发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3. 获取Cookie
Cookie[] cs = request.getCookies();
//获取数据,遍历Cookies
if(cs != null){
for (Cookie c : cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
客户端发送请求,服务器将信息放在响应头里面,即 set-Cookie:fjx=itcast ,返回给浏览器,保存在本地
客户端再次发送请求时,就会携带保存在本地数据,通过请求头发送给服务器,即Cookie:fjx=itcast
注意: 如下图红框中所示,我们创建了一个名为fjx,值为itcast的Cookile,过期时间为2019年1月18日凌晨三点多,之所以差八个小时,使我们所处的时区不同,我们是东八区。差八个小时。
cookie小知识
1. 一次可不可以发送多个cookie?
* 可以
* 可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c1 = new Cookie("fjx","itcast");
Cookie c2 = new Cookie("name","zhe");
//2.发送Cookie
response.addCookie(c1);
response.addCookie(c2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2. cookie在浏览器中保存多长时间?
1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
2. 持久化存储:
* setMaxAge(int seconds)
1. 正数:将Cookie数据写到硬盘的文件中。并指定cookie存活时间,时间到后,cookie文件自动失效
2. 负数:默认值
3. 零:删除cookie信息
@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c1 = new Cookie("msg","setMaxAge");
//2.设置cookie的存活时间
//c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
//c1.setMaxAge(-1);//默认值
//c1.setMaxAge(300);
c1.setMaxAge(0);//删除Cookie
//3.发送Cookie
response.addCookie(c1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3. cookie能不能存中文?
* 在tomcat 8 之前 cookie中不能直接存储中文数据。
* 需要将中文数据转码---一般采用URL编码(%E3)
* 在tomcat8之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析
@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c1 = new Cookie("msg","能存中文");
//2.发送Cookie
response.addCookie(c1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
4. cookie共享问题?
1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
* 默认情况下cookie不能共享
* setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
* 如果要共享,则可以将path设置为"/"
2. 不同的tomcat服务器间cookie共享问题?
* setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c1 = new Cookie("msg","能存中文");
//设置path,让当前服务器下部署的所有项目共享Cookie信息
c1.setPath("/");
//3.发送Cookie
response.addCookie(c1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
关于Cookie的分享就先到这里。