本文共 2867 字,大约阅读时间需要 9 分钟。
本章学习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适合存储无关重点的数据!
转载地址:http://duacn.baihongyu.com/