会话技术
会话: 一次会话包含多次请求和响应
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到一方断开为止
会话的功能:在一次会话的范围内的多次请求间共享数据
方式:
1.Cookie:
使用步骤:
1.创建cookie对象
new Cookie(String name,String value)
2.发送cookie对象
response.addCookie(Cookie cookie)
3.获取Cookie取数据
Cookie[] request.getCookies()
实现原理:基于响应头set-cookie和请求头cookie实现
使用细节:
1.一次可不可发送多个cookie
可以创建多个cookie对象,使用response调用多次addCoolie方法发送cookie
2.cookie的声明周期
1.默认浏览器关闭后 Cookie消失
2.持久化存储 setMaxAge(int seconds)
seconds=正数,根据传入的值持久化cookie,将cookie写到硬盘,存活的时间根据传入的值设置
seconds=0,删除cookie信息
seconds=负数,默认值
3.中文存储:tomca8之前不支持,如需存储一般采用URL编码,tomcat8之后支持直接存储。
特殊字符不支持,需要使用url编码
4.cookie的共享:
同一个tomcat部署了多个项目:
cookie默认时不共享,可以使用setPath(String path)设置共享,如果要共享可以将path设置为"/"
不同tomcat部署:
cookie默认时不共享,调用setDomain(String path),path设置一级域名,一级域名相同的多个服务器之间可以共享cookie
cookie的特点:
1.cookie存储的数据在客户端
2.浏览器对于单个cookie的大小有限制(默认4kb),一级对同一个域名下的cookie总数量有限制(一般20个)
cookie的作用:
1.cookie一般用于存储少量的不太敏感的数据
2.在不登录的情况下完成服务器对客户端的身份识别
package com.xiaoqiang.web;
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("/cookie1Servlet")
public class Cookie1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("msg", "hello");
resp.addCookie(cookie);
Cookie cookie2 = new Cookie("msg2", "hello");
resp.addCookie(cookie2);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
package com.xiaoqiang.web;
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("/cookie2Servlet")
public class Cookie2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
System.out.println("获取到cookie:name=" + c.getName() + ",value=" + c.getValue());
}
}else {
System.out.println("未获取到cookie的值");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
2.Session 服务端会话技术
在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中。
特点:
1.Session用于存储一次会话的多次请求的数据,存在服务器端
2.session可以存储任意类型,任意大小的数据
1.使用步骤:
1.获取session对象
HttpSession session = request.getSession();
2.存储数据
void session.setAttribute(key,value);
3.获取数据
Object session.getAttribute(key);
4.移除session的值
void session.removeAttribute(key);
2.原理
session的实现依赖于cookie
浏览器第一次请求服务器,请求头没有cookie信息,服务器会生成一个session对象,并将sessionId通过响应头设置cookie,后边的请求的请求
头中cookie会带着sessionId请求服务器,服务器会根据sessionId找到对应的session对象,如果请求头的cookie中没有对应的sessionId,服务器会
重新创建一个session对象
3.细节
1.客户端关闭,两次session是否为同一个
客户端关闭后意味着会话结束,cookie会消失,cookie里的sessionId就没有了,
下次请求服务器会因为没有sessionId生成新的session对象
2.客户端不关闭
客户端不关闭cookie中的sessionId是一直存在的,在有效期内使用的是同一个session对象
3.客户端不关闭,服务器关闭,两次session对象是否为同一个
不是同一个,但是要确保数据不丢失
1.session的钝化
在服务器关闭前,将session对象系列化到硬盘上
2.session的活化
在服务器启动后,将session文件转化为内存中的session对象
4.sesion的生命周期
1.服务器关闭
2.调用 invalidate()销毁
3.到默认时效时间自动销毁(一般默认半个小时,容器里可以设置)
4.与cookie的区别
1.session在服务器端,cookie在客户端
2.session没有数据大小限制,cookie有
3.session相比于cookie数据相对安全
package com.xiaoqiang.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/sessionDemoServlet")
public class SessionDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("session1","session1的值");
session.setAttribute("session2","session2的值");
String session1 = (String) session.getAttribute("session1");
String session2 = (String) session.getAttribute("session2");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("session1的值:"+session1);
response.getWriter().println("session2的值:"+session2);
session.removeAttribute("session1");
response.getWriter().println("session1的值被移除了,所以现在session1的值是:" + session.getAttribute("session1"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}