JavaWeb 之 Cookie 和 Session 技术 (四)
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());
同名 Cookie 问题
如果服务器端发送重复的 Cookie,那么会覆盖原有的 Cookie
浏览器存放 Cookie 的数量
一个 Cookie 只能保存一个信息
一个 web 站点可以给浏览器发送多个 cookie,最多存放 20 个 cookie
Cookie 大小有限制 4kb
[](()3、服务器端会话管理
============================================================================
[](()3.1、Httpsession
什么是 Httpsession?
服务器会给每一个用户(浏览器)创建一个 Httpsession 对象
一个 Seesion 独占一个浏览器,只要浏览器没有关闭,这个 Session 就存在
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中
[](()3.2、HttpSession 常用 API
[](()3.3、Httpsession 的获取
获取 HttpSession 对象
req.getSession()
获取 Session 对象
使用 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 的 IDsession.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、例一
我们给 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 已经存在
我们在另一个 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 中拿到数据
我们新建包 pojo
在包 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();
评论