前言
本章学习Session对象的相关知识
方法
1.概念
我们知道,request对象解决了同一个请求不同servlet的数据共享问题。那么,同一用户下的不同请求的数据该如何共享呢?那么就需要用到Session对象的相关知识了!实质上,它也用到了cookie技术。为什么这么说呢,用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其
对应的 session 对象。
2.特点
1)它存储在服务器端,这与cookie不同(cookie存储于浏览器端)
2)它依赖于cookie,存储浏览器端JSSESSIONID
3)它的有效期为一个会话,即浏览器关闭即消失
3.使用
1)获取session对象
我们知道,用户发送一次请求,如果没有session对象就会自动创建新的session对象,我们可以通过request对象间接获取session对象
HttpSession session = request.getSession();
2)设置session对象的有效时间
cookie可以设置有效时间,那么session依赖于cookie,同样可以设置有效时间,但是浏览器关闭session仍然消失
仍然需要注意的是session在浏览器关闭后会立刻失效,它代表着一次会话!
session.setMaxInactiveInterval(时间(s));
误区:
大家可能认为,我设置了session的有效期是30s,那么30s之后就会自动销毁!这是不对的,前提是你没有发新的请求,才在30s之后进行销毁,如果你在30s之内发送了新的请求,那么session的有效期将重新变为30s
3)强制session失效
我们可以通过session对象的一个方法强行让该session失效
session.invalidate();
4)使用session存储公共数据
我们知道,cookie可以存储共享的数据,那么session又是怎么存储一个会话的共享数据呢?
它使用setAttribute(键,值);设置数据,使用getAttribute(键)获取数据
实例:使用session存储登录用户名
package com.jwang.student.servlet;
import com.jwang.student.bo.User;
import com.jwang.student.service.UserService;
import com.jwang.student.service.impl.UserServiceImpl;
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;
@WebServlet("/login.do")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response){
try {
String username = request.getParameter("username");
String password = request.getParameter("password");
HttpSession session = request.getSession();
request.setCharacterEncoding("UTF-8");
UserService userService = new UserServiceImpl();
User user = new User("01", username, password);
if (userService.login(user)) {
session.setAttribute("username",username);
request.getRequestDispatcher("/success.jsp").forward(request, response);
} else {
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response){
this.doGet(request, response);
}
}
这样,前台就能获取到后台传递的session对象的值
注意:使用cookie同样实现了数据的共享,相对而言,session存储更加安全,cookie适合存储无关重点的数据!
总结
session和cookie异同
- session依赖于cookie技术
- session是服务器端的存储数据方式,cookie是浏览器端的数据存储方式
- session可以存储大量的数据且安全,cookie只能存储少量数据且不安全
- session对象浏览器关闭即失效,它属于临时cookie,cookie可以通过设置有效时间的方式达到关闭浏览器仍然生效的目的