Java Web 后端技术(三)

it2025-04-19  16

Java Web 后端技术(三)

会话概述

在B/S架构中,浏览器第一次向服务器发送请求时会建立会话,在有一方断开连接的时候,会话才会结束。而用于存储浏览器和服务器之间在请求和响应过程中产生的数据则称为会话技术。根据浏览器和服务端分别产生了两种对应的会话技术:Cookie和Session

1.Cookie

Cookie作用:在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)

SetServlet

public class SetServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.创建cookie对象,设置数据 Cookie cookie = new Cookie("name","jack"); // 2.通过response,响应(返回)cookie response.addCookie(cookie); } }

GetServlet

public class GetServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.通过request对象,接收cookie数组 Cookie[] cookies = request.getCookies(); // 2.遍历数组 if(cookies!=null){ for (Cookie c : cookies) { String name = c.getName(); String value = c.getValue(); System.out.println(name + " : " + value); } } } }

**原理:**基于HTTP协议,当浏览器第一次发送请求到服务器时,浏览器未携带任何cookie到浏览器端的SetServlet,并完成响应返回到浏览器端,在返回响应的同时完成对cookie的设置,设置了响应头:set-cookie:name=jack。浏览器在接收到响应后进行解析并存储到本地存储空间。在浏览器发起第二次请求时携带cookie信息发送到服务端。在服务器中GetServlet通过request获取到对应的key和value值。 服务器也可以同时发送多个cookie。

Cookie保存时间:默认情况下随着浏览器关闭,cookie也随之销毁。但同时也提供了设置cookie存活时间cookie.setMaxAge(int second);以秒作为单位。当时间设置为正数时,指定存活时间,当到达时间以后自动销毁;默认时间为负数,当浏览器关闭时,cookie自动销毁;当设置时间为0时,则会立即销毁自杀。

中文支持: 在Tomcat8之前的版本是不支持中文的,需要通过URLEncoder和URLDecoder进行编解码;而在之后的版本则支持中文。

EncodeCookie

public class EncodeCookie extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String product = "华为荣耀 30X,"; product= URLEncoder.encode(product, "UTF-8"); // 1.创建cookie对象 Cookie cookie = new Cookie("product", product); // 2.response响应cookie response.addCookie(cookie); } }

GetServlet

public class GetServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.通过request对象,接收cookie数组 Cookie[] cookies = request.getCookies(); // 2.遍历数组 if(cookies!=null){ for (Cookie c : cookies) { String name = c.getName(); String value = c.getValue(); // 解码 value = URLDecoder.decode(value, "UTF-8"); System.out.println(name + " : " + value); } } } }

2.Session

session作用:在一次会话的多次请求之间共享数据,将数据保存到服务器端。

API:

1. 存储数据 void setAttribute(String name,Object value) 2. 获取数据 Object getAttribute(String name) 3. 删除数据 void removeAttribute(String name)

SetSession

public class SetSession extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.通过rquest对象,获取session对象 HttpSession session = request.getSession(); // 2.操作session的API,存储数据 session.setAttribute("username", "哈哈,呵呵"); } }

GetSession

public class GetSession extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.通过rquest对象,获取session对象 HttpSession session = request.getSession(); // 2.操作session的API,获取数据 String username = (String) session.getAttribute("username"); System.out.println("GetSession获取:" + username); } }

工作原理: 浏览器发送请求到服务器端时访问SetSession将共享数据存储到一个session中,并开辟了一个session空间,并存储了共享数据。一旦存储数据到session共享空间以后会自动产生一个响应头set-cookie:JSESSIONID=1001(生成唯一标识并标明共享空间)响应浏览器。浏览器在接收到响应以后自动将cookie存储到存储空间中。在第二次请求发送中,会自动携带cookie,并通过标识找到对应的session空间并取出对应的key和value值。 注: 执行getSession()时会进行判断

第一次访问则会创建新的session对象并生成编号;不是第一次访问则会根据所携带的编号,找到对应的session对象,如果没有找到则会重新创建。

生命周期

创建:用户第一次调用request.getSession()方法时,创建销毁:服务器非正常关闭;非活跃状态30分钟后

cookie和session对比

cookiesession存储数据都在浏览器端存储数据都在服务器端存储数据只能是字符串存储数据只能是字符串单个大小不能超过4KB没有大小限制存储的数据不太安全存储的数据安全
最新回复(0)