Javaweb 会话跟踪学习记录(2)—Session

Javaweb 会话跟踪学习记录(2)—Session

 Session 技术是指使用 HttpSession 对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession 对象用来保存单个用户访问时的一些信息,是服务器在无状态的HTTP 协议下用来识别和维护具体某个用户的主要方式。 HttpSession 对象会在用户第一次访问服务器时由容器创建(注意只有访问JSP、 Servlet 等程序时才会创建,只访问 HTML、IMAGE 等静态资源并不会创建),当用户调用其失效方法(invalidate() 方法)或超过其最大不活动时间时会失效。在此期间,用户与服务器之间的多次请求都属于同一个会话。
 服务器在创建会话对象时,会为其分配一个唯一的会话标识 —SessionId,以“JSESSIONID”的属性名保存在客户端 Cookie 中,在用户随后的请求中,服务器通过读取 Cookie 中的 JSESSIONID 属性值来识别不同的用户,从而实现对每个用户的会话跟踪。
 cookie 和 session 的区别:

  • cookie 数据存放在客户的浏览器上, session数据放在服务器上。
  • cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session 。
  • session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 COOKIE。
  • 将登陆信息等重要信息存放为 SESSION,其他信息如果需要保留,可以放在COOKIE中

 1.获取HttpSession 对象
HttpServletRequest 接口提供了获取 HttpSession 对象的方法

方法 方法描述
getSession() 获取与客户端请求关联的当前的有效的Session,若没有Session关联则新建一个
getSession(boolean create) 获取与客户端请求关联的当前的有效的Session,若没有Session关联,当参数为真时,Session被新建,为假时,返回空值。

示例: 获取 HttpSession 对象:

HttpSession session = request.getSession();
或HttpSession session = request.getSession(true);

 2.HttpSession 接口的方法
HttpSession 接口提供了存取会话域属性和管理会话生命周期的方法

方法 方法描述
void setAttribute(String key,Object value) 以key/value的形式将对象保存在HttpSession对象中
Object getAttribute(String key) 通过key获取对象值
void removeAttribute(String key) 从HttpSession对象中删除指定名称key所对应的对象
void invalidate() 设置HttpSession对象失效
void setMaxInactiveInterval(int interval) 设定HttpSession对象的非活动时间(以秒为单位),若超过这个时间,HttpSession对象将会失效
int getMaxInactiveInterval() 获取HttpSession对象的有效非活动时间(以秒为单位)
String getId() 获取HttpSession对象标识sessionid
long getCreationTime() 获取HttpSession对象产生的时间,单位是毫秒
long getLastAccessedTime() 获取用户最后通过这个HttpSession对象送出请求的时间

 3.存取会话域属性的方法
示例:存取会话域属性

//存储会话域属性 "username", 值为"CSDN"
session.setAttribute("username","CSDN");
//通过属性名 "username" 从会话域中获取属性值
String uname =(String)session.getAttribute("username");
//通过属性名将属性从会话域中移除
session.removeAttribute("username");

 4.管理会话生命周期的方法

  • 示例:获取会话的最大不活动时间在这里插入代码片int time = session.getMaxInactiveInterval(); // 单位为”秒“
  • 会话的最大不活动时间指会话超过此时间段不进行任何操作,会话自动失效的时间。
  • HttpSession 对象的最大不活动时间与容器配置有关,对于 Tomcat容器,默认时间为 1800 秒。
  • 通过 web.xml 设置会话的最大不活动时间(通用):

	
	10

  • 通过会话对象的 setMaxInactiveInterval() 方法设置会话的最大不活动时间(个别):
session.setMaxInactiveInterval(600); //单位为”秒“
  • 会话对象除了在超过最大不活动时间自动失效外,也可以通过调用invalidate() 方法让其立即失效。
  • 示例:设置会话立即失效:session.invalidate ();
  • 服务器在执行会话失效代码后,会清除会话对象及其所有会话域属性,同时响应客户端浏览器清除 Cookie 中的 JSESSIONID 。
  • 在实际应用中,此方法多用来实现系统的“安全退出”,使客户端和服务器彻底结束此次回话,清除所有会话相关信息,防止会话劫持等黑客攻击。

 5.演示
 演示使用Session实现购物车
创建phoneChoose.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>



"UTF-8">
Insert title here


	
	
<% //session.removeAttribute("shoppingCar"); //session.invalidate(); %>
"ShoppingCarServlet" method="post"> <% out.print("

手机商城



"
); %> "checkbox" name="phone" value="p30" />华为P30&emsp;&ensp; ;
"checkbox" name="phone" value="mate30" />华为mate30
"checkbox" name="phone" value="iphone11" />iphone11&emsp;
"checkbox" name="phone" value="iphone12" />iphone12&emsp;
"checkbox" name="phone" value="xiaomi10p" />小米10pro ; ;
"checkbox" name="phone" value="sanxings20" />三星S20&emsp; ; ;
"checkbox" name="phone" value="iqoo3" />iqoo3&emsp;&emsp; ; ;
"checkbox" name="phone" value="vivoNEX3" />vivo NEX3 ; ;
"submit" value="购买"> "submit" value ="查看购物车" >

创建ShoppingCarServlet

package com;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

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;

/**
 * Servlet implementation class ShoppingCarServlet
 */
@WebServlet("/ShoppingCarServlet")
public class ShoppingCarServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public ShoppingCarServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");

		HttpSession session = request.getSession();
		Map car = (Map) session.getAttribute("shoppingCar");
		if (car == null) {
			car = new HashMap<>();
		}

		String[] phones = request.getParameterValues("phone");
		if (phones != null && phones.length > 0) {
			for (String phone : phones) {
				// 判断购物车中是否有某手机的购买信息
				if (car.get(phone) != null) {
					int num = car.get(phone);
					car.put(phone, num + 1);
				} else {
					// 第一次购买手机
					car.put(phone, 1);
				}
			}
		}

		session.setAttribute("shoppingCar", car);
		response.sendRedirect("ShoppingListServlet");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

创建ShoppingListServlet

package com;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

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;

/**
 * Servlet implementation class ShoppingListServlet
 */
@WebServlet("/ShoppingListServlet")
public class ShoppingListServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public ShoppingListServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();

		HttpSession session = request.getSession();
		@SuppressWarnings("unchecked")
		Map car = (Map) session.getAttribute("shoppingCar");

		if (car != null && car.size() > 0) {
			out.print("

您购买的手机有:

"
); for (String phoneName : car.keySet()) { out.print("

" + phoneName + ":" + car.get(phoneName) + "台" + "

"
); } } else { out.print("

您的购物车中没有任何商品

"
); } out.print(""); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }

运行
Javaweb 会话跟踪学习记录(2)—Session_第1张图片
Javaweb 会话跟踪学习记录(2)—Session_第2张图片
Javaweb 会话跟踪学习记录(2)—Session_第3张图片
Javaweb 会话跟踪学习记录(2)—Session_第4张图片

你可能感兴趣的:(Javaweb 会话跟踪学习记录(2)—Session)