会话技术
会话:
1. 概念:
一次会话中包含多次请求和响应.
一次会话:
浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
2.功能:
再一次会话范围内的多次请求间,数据共享
3.方式:
1.客户端会话技术 :Cookie
2.服务器端会话技术. :session
Cookie
1.概念
客户端的会话技术,将数据保存到客户端。
2.快速入门
**使用步骤**
1. 创建 Cookie对象,绑定数据
new Cookie(String name,String value);
2. 发送 Cookie 对象
response.addCookie();
3. 获取Cookie,拿到数据
request.getCookies();
代码示例:
package cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie d对象
Cookie cookie = new Cookie("msg","hello");
//发送
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet( "/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("post============");
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie :cookies){
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+"====value="+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
cookie 原理
基于响应头 set-cookie 和请求头 getCookie 实现的
cookie 的细节问题
-
一次可不可以发送多个cookie?
可以,可以创建多个Cookie对象,使用 response 调用多次addCookie 方法发送 cookie
-
cookie 在浏览器中保存多少时间?
1. 默认情况下,当浏览器关闭后,cookie数据就被销毁 2. 持久化存储 setMaxAge(int seconds); 1. 整数 : 将cookie数据写到硬盘的文件中,持久化存储 2. 负数 : 默认值;浏览器已关闭,就没有信息。 3. 零: 删除cookie信息
-
cookie 能不能存储 中文?
在tomcat 8 之前 cookie 不能直接存中文数据, 在Tomcat 8之后 cookie 支持中文数据。
-
cookie 共享问题?
-
假设在一个tomcat部署了多个 web项目,那么在这些web项目中cookie能不能共享?
默认情况下 cookie 是不能共享的setpath(String path) :设置cookie的获取范围;默认情况下设置当前的虚拟目录;
如果需要共享,则可以将 path设置为 “/” -
不同的 tomcat 服务器 间 如何设置 cookie 共享?
setDomain(String path): 如果设置一级域名相同,那么多个服务器间 cookie 可以共享
例如 setDomain(“.baidu.com ”) 那么 tieba.baidu.com 和 new.baidu.com 之间可以实现 coolie共享
-
cookie 的特点 和 作用
- cookie 存储数据在 客户端 浏览器;
- 浏览器对单个cookie 的大小有限制 以及 对同一个域名下的总 cookie 数量 有限制
作用:
- cookie 一般用于存储少量的不太敏感的数据
- 在不登录的情况下,完成服务器对客户端身份的识别
cookie 案例
package cookieDemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
/**
*模拟 用户登录
1.第一次登录 没有cookie 返回 欢迎登录
2 第二次 登录 有 cookie 显示 欢迎再次登录,以及上次登录时间
*/
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Date data = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd");
String format = simpleDateFormat.format(data);
Cookie[] cookies = request.getCookies();
boolean flag=false;
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("lastTime".equals(name)) {
String value = cookie.getValue();
response.getWriter().write("欢迎再次归来,上次访问的时间是:" + value);
cookie.setValue(format);
cookie.setMaxAge(60*60*24*30);
response.addCookie(cookie);
flag =true;
break;
}
}
}
if (cookies == null || cookies.length == 0 || flag == false){
Cookie cookie1 = new Cookie("lastTime", format);
cookie1.setMaxAge(60*60*24*30);
response.addCookie(cookie1);
response.getWriter().write("欢迎第一次归来");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}