写点什么

JavaWeb 之 Cookie 和 Session 技术 (四)

  • 2022 年 4 月 25 日
  • 本文字数:3569 字

    阅读完需:约 12 分钟

String value = "张三";


// 通过 URLEncoder.encode() 来进行编码


name = URLEncoder.encode(name);


value = URLEncoder.encode(value);


// 创建 Cookie 对象


cookie cookie = new Cookie(name,value);


// 发送 Cookie 对象


resp.addCookie(cookie);


// 获取时通过 URLDecoder.decode()来进行解码


URLDecoder.decode(cookie.getName());


URLDecoder.decode(cookie.getValue());


  1. 同名 Cookie 问题


如果服务器端发送重复的 Cookie,那么会覆盖原有的 Cookie


  1. 浏览器存放 Cookie 的数量


  • 一个 Cookie 只能保存一个信息

  • 一个 web 站点可以给浏览器发送多个 cookie,最多存放 20 个 cookie

  • Cookie 大小有限制 4kb


[](()3、服务器端会话管理


============================================================================


[](()3.1、Httpsession




  1. 什么是 Httpsession?


  • 服务器会给每一个用户(浏览器)创建一个 Httpsession 对象

  • 一个 Seesion 独占一个浏览器,只要浏览器没有关闭,这个 Session 就存在

  • 服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中


[](()3.2、HttpSession 常用 API





[](()3.3、Httpsession 的获取




  1. 获取 HttpSession 对象


  • req.getSession() 获取 Session 对象


  1. 使用 HttpSession 对象


  • session.setAttribute(String name,object) 设置 session 域对象

  • session.removeAttribute(String name) 移除指定名称的 session 域对象


[](()3.4、session 域对象




? Session 用来表示一次会话,在一次会话中数据是可以共享的,这时 session 作为域对象存在,可以通过setAttribute(name,value) 方法向域对象中添加数据,通过getAttribute(name)从域对象中获取数据,通过removeAttribute(name)从域对象中移除数据


  • session.getId() 获取 session 的 ID

  • session.isNew() 判断是否是新的 session 对象


// 得到 Session


HttpSession session = req.getSession();


// 给 Session 中存东西


session.setAttribute("name","狂神说");


// 获取 Session 的 ID


String id = session.getId();


// 判断 Session 是不是新创建的


session.isNew();


  • 数据存储在 session 域对象中,当 session 对象不存在了,或者是两个不同的 session 对象时,数据也就不能共享了。


[](()3.5、例子



[](()3.5.1、例一

  1. 我们给 session 中存入一个字符串,并在另一个 session 中拿到数据


SessionDemo01.java


public class SessionDemo01 extends HttpServlet {


@Override


protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


// 解决乱码问题


req.setCharacterEncoding("utf-8");


resp.setCharacterEncoding("utf-8");


resp.setContentType("text/html;charset=UTF-8");


// 得到 Session


HttpSession session = req.getSession();


// 给 Session 中存东西


session.setAttribute("name","狂神说");


// 获取 Session 的 ID


String id = session.getId();


// 判断 Session 是不是新创建的


if(session.isNew()){


resp.getWriter().write("session 创建成功,ID:" + id);


}else {


resp.getWriter().write("session 已经在服务器中存在了,ID:" + id);


}


}


@Override


protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


doGet(req, resp);


}


}


  • 在 web.xml 中注册 servlet 映射为 /s1


<servlet>


<servlet-name>SessionDemo01</servlet-name>


<servlet-class>com.kuang.servlet.SessionDemo01</servlet-class>


</servlet>


<servlet-mapping>


<servlet-name>SessionDemo01</servlet-name>


<url-pattern>/s1</url-pattern>


</servlet-mapping>


  • 测试启动



当浏览器打开时,会自动创建一个 session 对象,此时 session 已经存在


  1. 我们在另一个 session 对象中拿到第一个 session 中存入的数据


SessionDemo02.java


public class SessionDemo02 extends HttpServlet {


@Override


protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


// 解决乱码问题


req.setCharacterEncoding("utf-8");


resp.setCharacterEncoding("utf-8");


resp.setContentType("text/html;charset=UTF-8");


// 得到 Session


HttpSession session = req.getSession();


// 获取第一个 session 中存入的数据 name


String name = (String) session.getAttribute("name");


resp.getWriter().write(name);


}


@Override


protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


doGet(req, resp);


}


}


  • 在 web.xml 中注册 servlet 映射为 /s2


<servlet>


<servlet-name>SessionDemo02</servlet-name>


<servlet-class>com.kuang.servlet.SessionDemo02</servlet-class>


</servlet>


<servlet-mapping>


<servlet-name>SessionDemo02</servlet-name>


<url-pattern>/s2</url-pattern>


</servlet-mapping>


  • 访问测试




![在这里插入图片描述](https://img-blog.csdnimg.cn/cfbf2cd69a21436d9314993fda4182f9.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aH 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 R0cHM6Ly9ibG9nLmNzZG4ubmV0L0F1Z2Vuc3Rlcm5fUVhM,size_16,color_FFFFFF,t_70#pic_center)

[](()3.5.2、例二

我们给 session 中存入一个对象,并在另一个 session 中拿到数据


  1. 我们新建包 pojo

  2. 在包 pojo 下新建 Person 类


public class Person {


private String name;


private int age;


public Person() {


}


public Person(String name, int age) {


this.name = name;


this.age = age;


}


public String getName() {


return name;


}


public void setName(String name) {


this.name = name;


}


public int getAge() {


return age;


}


public void setAge(int age) {


this.age = age;


}


@Override


public String toString() {


return "Person{" +


"name='" + name + ''' +


", age=" + age +


'}';


}


}


SessionDemo01.java


public class SessionDemo01 extends HttpServlet {


@Override


protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


// 解决乱码问题


req.setCharacterEncoding("utf-8");


resp.setCharacterEncoding("utf-8");


resp.setContentType("text/html;charset=UTF-8");


// 得到 Session


HttpSession session = req.getSession();


// 给 Session 中存东西 此时存入一个对象


session.setAttribute("name",new Person("秦将",1));


// 获取 Session 的 ID


String id = session.getId();


// 判断 Session 是不是新创建的


if(session.isNew()){


resp.getWriter().write("session 创建成功,ID:" + id);


}else {


resp.getWriter().write("session 已经在服务器中存在了,ID:" + id);


}


}


@Override


protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


doGet(req, resp);


}


}


SessionDemo02.java


public class SessionDemo02 extends HttpServlet {


@Override


protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


// 解决乱码问题


req.setCharacterEncoding("utf-8");


resp.setCharacterEncoding("utf-8");


resp.setContentType("text/html;charset=UTF-8");


// 得到 Session


HttpSession session = req.getSession();


// 获取第一个 session 中存入的数据


Person person = (Person) session.getAttribute("name");


resp.getWriter().write(person.toString());


}


@Override


protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


doGet(req, resp);


}


}


  • 访问测试





[](()3.6、原理




Session 的实现是依赖于 Cookie 的。


HttpSession,它虽然是服务端会话管理技术的对象,但它本质仍是一个 Cookie。是一个由服务器自动创建的特殊的 Cookie,Cookie 的名称就是 JSESSIONID,Cookie 的值是服务器分配的一个唯一的标识。


当我们使用 HttpSession 时,浏览器在没有禁用 Cookie 的情况下,都会把这个 Cookie 带到服务器端,然后根据唯一标识去查找对应的 HttpSession 对象,找到了,我们就可以直接使用了。


[](()3.7、session 对象的销毁



[](()3.7.1 默认时间到期

  • 当客户端第一次请求 servlet 并且操作 session 时,session 对象生成,Tomcat 中 session 默认的存活时间为 30min

  • 那么 session 的默认时间可以改吗?答案是肯定的

  • 可以在 Tomcat 中 conf 目录下的 web.xml 文件中进行修改


<session-config>


<session-timeout>30</session-timeout>


</session-config>

[](()3.7.2 自己设定到期时间

  • session.setMaxInactiveInterval(int) :设定 session 存活时间(单位为秒)

  • session.getMaxInactiveInterval(): 查看当前 session 存活时间


// 获取 session 对象


HttpSession session = request.getSession();

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
JavaWeb之Cookie和Session技术(四)_Java_爱好编程进阶_InfoQ写作社区