1 什么是会话?
用户打开浏览器,访问 web 服务器的资源,这个时候会话建立起来,直到有一方断开了连接,会话结束。在一次的会话中可以包含多次的请求以及相应;
会话跟踪就是在一次会话的多次请求中共享数据;
一个浏览器访问一个服务器两者之间建立起来的就是一个会话,浏览器关闭页面,会话结束;
为什么需要共享数据? 比如一个登录功能,浏览器在保持打开的状态下,不小心点击了刷新,访问的是同一个服务器,乜有共享数据的话,上一次的登录信息都消失了,显然用户体验是不好的,所以这个时候需要进行会话跟踪,提高用户的体验;
共享数据,可以方便一些用户的操作,告诉服务器虽然是多次的操作,但是是一个用户发送的请求,同一个用户请求的数据是可以共享的; 比如登录一页网页,短时间内,不需要反复的登录,让服务器记住刚才是某个用户登录的就行;
2 解决 http 协议中的无状态实现方式
客户端会话跟踪技术:Cookie 服务端会话跟踪技术:Ssession
3 Cookie
3.1 Cookie 基本使用原理
3.1.1 服务端向浏览器发送 Cookie
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1 创建 Cookie 对象
Cookie cookie = new Cookie("usernaem","zs");
// 2 发送 Cookie response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
复制代码
3.1.2 服务器获取浏览器发送来的 Cookie
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1 获取 Cookie 数组
Cookie[] cookies = request.getCookies();
// 2 遍历数组
for (Cookie cookie : cookies) {
// 3 获取数据
String name = cookie.getName();
if ("username".equals(name)) {
String value = cookie.getValue();
System.out.println(name + ":" + value);
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
复制代码
3.3 Cookie 原理
Cookie 是怎么实现一次会话,两次访问的数据共享的
实现原理就是,服务器在响应头中将数据发送到浏览器,然后浏览器再访问该服务器的时候,在请求头中将 cookie 携带过去
3.4 Cookie 使用细节
中文的问题可以通过编码以及解码的形式进行解决
4 Session
将数据保存在服务端; Java EE 提供 HttpSession 接口,实现了一次会话多次请求间数据共享的功能;
4.1 Session 基本使用
4.1.1 SessionDemo1
@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取Session 对象
HttpSession session = request.getSession();
// 存储到 Session 中
session.setAttribute("username","zs");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
复制代码
4.1.2 SessionDemo2
@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取 Session 对象
HttpSession session = request.getSession();
// 获取数据
Object username = session.getAttribute("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
复制代码
4.2 Session 原理
Session 是基于 Cookie 的
4.3 Session 使用细节
浏览器关闭了之后,获取到的 Session 就不是一个了,因为相当于开启了两次会话,是两个不一样的会话;不关闭服务器,多次访问同一个服务器,那么 Session 就是同一个,因为始终是一个会话;Session 的数据,不能关闭服务器,但是 Cookie 的数据可以在计算机中存储很长时间;
5 小结
Cookie 为了长期存储,未登录就可以识别的情况下使用; Session 存储的是安全数据;
6 登录注册案例需求
6.1 需求说明
1、完成用户登录功能,如果用户勾选"记住用户" 下次的访问到登录界面自动的填充用户名以及密码;
2、完成注册功能,实现验证码功能