Servlet中Cookie和Session技术

时间:2022-12-24 08:54:38



✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
????个人主页: ​​Java Fans的博客​​
????个人信条:不迁怒,不贰过。小知识,大智慧。
????当前专栏: ​​前端案例分享专栏​​
✨特色专栏: ​​国学周更-心性养成之路​​
????本文内容:JS圣诞树
更多内容点击 ????
       ​​QQ注册界面仿写(HTML+CSS+JS)​​



一、状态管理

1.1 现有问题

HTTP协议是无状态的,不能保存每次提交的信息

如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系

对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就有问题了。

1.2 概念

将浏览器与Web服务器之间多次交互当做一个整体来处理,并且将多次交互所涉及到的数据(即状态)保存下来。

1.3 状态管理分类

客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术。

服务器状态管理技术:将状态保存在服务器端。代表性的是session技术(服务器传递sessionID时需要使用Cookie的方式)

二、Cookie的使用

2.1 什么是Cookie

Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。

一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。

一个Cookie主要有标识该信息的名称(name)和值(value)组成。



Servlet中Cookie和Session技术


2.2 创建Cookie

Cookie cookie = new Cookie("name","zhangsan");
Cookie cookie = new Cookie("name","zhangsan");

2.3 获取Cookie

String name=cookie.getName();
String nameValue=cookie.getValue();
System.out.println(name+":"+nameValue);
String name=cookie.getName();
String nameValue=cookie.getValue();
System.out.println(name+":"+nameValue);

2.4 修改Cookie

Cookie cookie = new Cookie("name","lisi");
Cookie cookie = new Cookie("name","lisi");

2.5 Cookie编码与解码

2.5.1 创建带中文Cookie

Cookie cookie = new Cookie(URLEncoder.encode("姓名", "UTF-8"), URLEncoder.encode("张三", "UTF-8"));
Cookie cookie = new Cookie(URLEncoder.encode("姓名", "UTF-8"), URLEncoder.encode("张三", "UTF-8"));

2.5.2 读取带中文Cookie

String cookieName= URLDecoder.decode(cookie1.getName(),"UTF-8");
String cookieValue=URLDecoder.decode(cookie1.getValue(),"UTF-8");
System.out.println(cookieName+"-"+cookieValue);
String cookieName= URLDecoder.decode(cookie1.getName(),"UTF-8");
String cookieValue=URLDecoder.decode(cookie1.getValue(),"UTF-8");
System.out.println(cookieName+"-"+cookieValue);

2.6 Cookie优点和缺点

2.6.1 Cookie优点

  • 可配置到期规则
  • 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对
  • 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的

2.6.2 Cookie缺点

  • 大小受到限制:大多数浏览器对Cookie的大小有4K、8K字节的限制
  • 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收Cookie的能力,因此限制了这一功能
  • 潜在的安全风险:Cookie可能会被篡改。会对安全性造成潜在风险或者导致依赖于Cookie的应用程序失败

三 Session对象(重要)

3.1 Session概述

(1)Session用于记录用户的状态。Session指的是一段时间内,单个客户端与Web服务器的一连串相关的交互过程。

(2)在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。

(3)Session是由服务器端创建的

3.2 Session原理

(1)Session会为每一次会话分配一个Session对象

(2)同一个浏览器发起的多次请求,同属于一次会话(Session)

(3)首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端

3.3 Session使用

Session作用域:拥有存储数据的空间,作用范围是一次会话有效

  • 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话
  • 可以将数据存入Session中,在一次会话的任意位置进行获取
  • 可传递任何数据(基本数据类型、对象、集合、数组)

3.3.1 获取Session

Session是服务器端自动创建的,通过request对象获取

//获取Session对象

HttpSession session = request.getSession();

System.out.println(“ID:”+session.getId());//唯一标记

3.3.2 Session保存数据

使用setArrtibute(属性名,Object)保存数据到session中

session.setAttribute("key",value);//以键值对形式存储在session作用域中

3.3.3 Session获取数据

使用getAttribute("属性名");获取session中数据

session.getAttribute("key");//通过String类型的key访问Object类型的value

3.3.4 Session移除数据

使用removeAttribute("属性名");从session中删除数据

session.removeAttribute("key");//通过键移除session作用域中的值

3.4 Session与Request应用区别

(1)request是一次请求有效,请求改变,则request改变

(2)session是一次会话有效,浏览器改变,则session改变

3.4.1 Session应用


package cn.lqgx.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "ServletSession", value = "/ServletSession")
public class ServletSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Session对象
HttpSession session = request.getSession();
System.out.println("ID:"+session.getId());//唯一标记
session.setAttribute("key","姓名");//以键值对形式存储在session作用域中
// String seStr=(String)session.getAttribute("key");//通过String类型的key访问Object类型的value

System.out.println(session.getAttribute("key"));
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

package cn.lqgx.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "ServletSession", value = "/ServletSession")
public class ServletSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Session对象
HttpSession session = request.getSession();
System.out.println("ID:"+session.getId());//唯一标记
session.setAttribute("key","姓名");//以键值对形式存储在session作用域中
// String seStr=(String)session.getAttribute("key");//通过String类型的key访问Object类型的value

System.out.println(session.getAttribute("key"));
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

3.4.2 GetValueServlet.java


package cn.bdqn.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "LifeSessionServlet", value = "/LifeSessionServlet")
public class LifeSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Session对象
HttpSession session = request.getSession();
System.out.println(session.getId());
//手动设置session的有效期
// session.setMaxInactiveInterval(10);

//encodeURL():将当前url的后面拼接一个sessionID值,然后使用这个重写的url去进行重定向访问
String newUrl =response.encodeURL("/studentProject_war_exploded/SessionServlet");
System.out.println("overriding:"+newUrl);

response.sendRedirect(newUrl);

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

package cn.bdqn.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "LifeSessionServlet", value = "/LifeSessionServlet")
public class LifeSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Session对象
HttpSession session = request.getSession();
System.out.println(session.getId());
//手动设置session的有效期
// session.setMaxInactiveInterval(10);

//encodeURL():将当前url的后面拼接一个sessionID值,然后使用这个重写的url去进行重定向访问
String newUrl =response.encodeURL("/studentProject_war_exploded/SessionServlet");
System.out.println("overriding:"+newUrl);

response.sendRedirect(newUrl);

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

3.5 Session的生命周期

  1. 开始

第一次使用到Session的请求产生,则创建Session

  1. 结束
  • 浏览器关闭,则失效
  • Session超时,则失效

session.setMaxInactiveInterval(seconds);//设置最大有效时间(单位:秒)

  • 手工销毁,则失效

session.invalidate();//登录退出,销毁

3.5.1 Session失效

session.setManInactiveInterval(60*60);//设置session最大有效期为1小时

session.invalidate();//手工销毁

3.6 浏览器禁用Cookie解决方案(了解)

3.6.1 浏览器禁用Cookie的后果

服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁止Cookie,则sessionID不会被浏览器保存,此时,服务器可以使用URL重写这样的方式来发送sessionID

3.6.2 URL重写

浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即在原来的地址后面加上了sessionID)

3.6.3 实现URL重写

response.encodeRedirectURL(String url)生成重写的URL


码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击​​关注博主​​,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:​​《国学周更—心性养成之路》​​,学习技术的同时,我们也注重了心性的养成。



Servlet中Cookie和Session技术