Java Web 会话技术Session
2020/8/25
session
1.简述和快速入门
视频笔记
快速入门
1.获取session对象(使用request的getSession的方法)
2.使用sessio(session是会话作用域和请求作用域一样去使用,getAttribute和setAttribute方法来设置键值对)
代码如下
SessionDemo1
package cn.zsc.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/***
* Session快速入门
* 步骤
* 1.先获取session对象,使用request的getSession的方法
* 2.使用session来设置要存储的数据,使用setAttribute的方法
* 3.使用session来获取存储的数据,使用getAttribute的方法
*/
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.获取session对象
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("name","张上");
session.setAttribute("age","18");
session.setAttribute("hobby","singing");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
SessionDemo1_1
package cn.zsc.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/SessionDemo1_1")
public class SessionDemo1_1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//使用session来获取存储的数据
//1.获取session对象
HttpSession session = request.getSession();
//2.根据储存数据的名字来获取值
Enumeration<String> attributeNames = session.getAttributeNames();
while (attributeNames.hasMoreElements()){
String s = attributeNames.nextElement();
Object name = session.getAttribute(s);
response.getWriter().println(s+":"+name+"<br>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.细节和特点
视频笔记
1.第一个问题:当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
代码如下
package cn.zsc.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/***
* 当客户端关闭后,服务器不关闭,还是可以继续获取到同一个session
* 解决方法:如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。并且发送cookie
*/
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.获取session
HttpSession session = request.getSession();
//2.创建cookie
Cookie ck=new Cookie("JSESSIONID",session.getId());
ck.setMaxAge(60*60); //cookie持久化一天
//3.发送cookie(千万不要忘记发送cookie)
response.addCookie(ck);
//4.打印session对象
System.out.println(session);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.第二个问题:客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
客户端不关闭,服务器关闭后,两次获取的session不是同一个,但是要确保数据不丢失
解决方法:
session的钝化:
在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
在tomcat中已经帮我们解决session的钝化与活化,而且必须使用本地的tomcat才行,
idea并不可以实现这样的功能,他只能实现钝化,不能实现活化
代码如下
package cn.zsc.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/***
*客户端不关闭,服务器关闭后,两次获取的session不是同一个,但是要确保数据不丢失
* 解决方法:
* session的钝化:
* 在服务器正常关闭之前,将session对象系列化到硬盘上
* session的活化:
* 在服务器启动后,将session文件转化为内存中的session对象即可。
* *在tomcat中已经帮我们解决session的钝化与活化,而且必须使用本地的tomcat才行,
* idea并不可以实现这样的功能,他只能实现钝化,不能实现活化
*/
@WebServlet("/SessionDemo3")
public class SessionDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.获取session对象
HttpSession session = request.getSession();
System.out.println(session);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
第三个问题:session什么时候被销毁?
解答:
- 服务器关闭
2. session对象调用invalidate() 。
3. session默认失效时间 30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
特点
- session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
3.session和cookie的区别
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
在响应重定向中一般使用session来共享数据,请求转发中可以直接使用request的请求作用域来共享数据