小言_互联网的博客

JavaWeb核心技术系列教程(16)——HttpSession

466人阅读  评论(0)

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

HttpSession概述

十多年过去了,我早已离开了石家庄。我在北国超市使用的折叠式的会员卡也早已落入生活的尘埃里。 今日,当我再去商场办理会员卡的时候店员也不会再给我一张纸质的会员卡了,只需要提供手机号就可以。每当我去商场购物,只需要报自己的手机号店员就可以查询到我的姓名、消费详情、家庭住址、消费总额、积分额度等信息。换句话说:会员卡的相关信息不再掌握在我自己手中而是保存在了商场里。

Cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现 数据的共享。但是,如果传递的信息比较多,Cookie技术会增大服务器端程序处理的难度。这时,我们可使用HttpSession将会话数据保存到服务器端。当客户端浏览器初次访问Web服务器时Web容器创建HttpSession对象及其ID并将该ID回传至客户端浏览器。此后,当客户端浏览器携带该ID至服务端时,服务器便找出与之对应的HttpSession对象供其进行数据存储操作。

HttpSession原理

  • 当客户端浏览器第一次访问服务器时,Web容器创建HttpSession对象及其与之对应的ID

  • 服务端将该ID以Cookie的形式返回至客户端浏览器;其中,Cookie的名称为JSESSIONID;语法如下:

    Set-Cookie:JSESSIONID=ID值;Path=Cookie的有效路径;

  • 客户端后续访问服务器时使用Cookie将该JSESSIONID携带至服务器;语法如下:

    Cookie: JSESSIONID=ID值

  • 服务端依据JSESSIONID找出与之对应的HttpSession进行数据存取操作

获取HttpSession

可通过HttpServletRequest的getSession( )方法获取HttpSession

public HttpSession getSession( );

在此,只需要调用一行代码request.getSession( )就可获取HttpSession;那么,这句代码的内部到底做了哪些事情呢?

  • 1、获取名称为JSESSIONID的Cookie的值
  • 2、如果没有获取到该Cookie则创建一个新的HttpSession且为其分配与之对应的唯一的SessionID;与此同时,为浏览器生成一个名字为JSESSIONID,值为sessionID的Cookie
  • 3、如果可获取到该Cookie,则取出该cookie的值(即HttpSession对象的SessionID),再依据此SessionID从服务器中找到与其对应的HttpSession

HttpSession常用方法

在此,介绍HttpSession中常用的方法及其作用。

public String getId( )

该方法用于返回HttpSession的唯一标识符

public boolean isNew( )

该方法用于判断当前HttpSession是否是新创建的

public void invalidate( )

该方法用于销毁HttpSession

public ServletContext getServletContext( )

该方法用于获取代表当前Web应用程序的ServletContext对象

public void setMaxInactiveInterval(int interval)

该方法用于设置session的最大闲置时间(单位为秒),默认为30分钟。当超过最大闲置时间后session将被销毁。

public void setAttribute(String name, Object value)

该方法用于向HttpSession中保存数据

public Object getAttribute(String name)

该方法用于从HttpSession中获取数据

public void removeAttribute(String name)

该方法用于从HttpSession中移除数据

HttpSession常用示例

在此,以示例形式介绍HttpSession常见使用方式。

HttpSession入门示例

index.html代码如下:

<!DOCTYPE html>
<!-- 本文作者:谷哥的小弟-->
<!-- 博客地址:https://blog.csdn.net/lfdfhl-->
<html>
	<head>
		<meta charset="utf-8">
		<title>index</title>
	</head>
	<body>
	    <h2 align="center" style="color: red;">本文作者:谷哥的小弟</h2>
		<h2 align="center" style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
	</body>
</html>

index.html页面如下:

TestSessionServlet如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * Session入门示例
 * 1、访问该Servlet时,假若没有Session则创建Session并保存数据
 * 2、访问该Servlet时,假若存在Session则从该Session中获取数据
 */
public class TestSessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1621209779259225642L;
	public final String JSESSIONID="JSESSIONID";
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		boolean hasSession=false;
		PrintWriter writer = response.getWriter();
		//读取所有Cookie
		Cookie[] cookies = request.getCookies();
		if(cookies!=null) {
			for(int i=0;i<cookies.length;i++) {
				//判断是否有名称为JSESSIONID的Cookie
				Cookie cookie = cookies[i];
				String name = cookie.getName();
				if(name.equals(JSESSIONID)) {
					hasSession=true;
				}
			}
		}
		
		if(hasSession) {
			//假若存在Session则从该Session中获取数据
			HttpSession session = request.getSession();
			String id = session.getId();
			String username=(String) session.getAttribute("username");
			writer.write("<h3>"+"sessionId="+id+"</h3>");
			writer.write("<h3>"+"username="+username+"</h3>");
		}else {
			//假若没有Session则创建Session并保存数据
			writer.write("<h3>"+"session is null"+"</h3>");
			HttpSession session = request.getSession();
			String id = session.getId();
			writer.write("<h3>"+"create session , id="+id+"</h3>");
			session.setAttribute("username", "tom");
		}
		
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

}

web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Session01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>sessionServlet</servlet-name>
    <servlet-class>cn.com.TestSessionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>sessionServlet</servlet-name>
   <url-pattern>/sessionServlet</url-pattern>
  </servlet-mapping>
</web-app>

结果如下:

第一次访问TestSessionServlet时:

第二次及其以后访问TestSessionServlet时:

用户登录

登录流程分析:

  • 用户在login.html输入用户名和密码登录
  • LoginServlet处理登录逻辑;如果正确跳转至WelcomeServlet,如果失败则重定向至login.html页面
  • WelcomeServlet显示欢迎信息,并可通过超链接跳转至LogoutServlet
  • LogoutServlet处理退出登录逻辑,并重定向至login.html页面

login.html如下:

<!DOCTYPE html>
<!-- 本文作者:谷哥的小弟-->
<!-- 博客地址:https://blog.csdn.net/lfdfhl-->
<html>
	<head>
		<meta charset="UTF-8">
		<title>登录</title>
	</head>
	<body>
		<h2 style="color: red;">本文作者:谷哥的小弟</h2>
		<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
		<form name="loginform" action="/Session04/LoginServlet" method="post">
			用户: <input name="username" type="text" /><br /> <br />
			密码: <input name="password" type="password" /><br /> <br />
			<input type="submit" value="提交" id="loginsubmit" />
		</form>
	</body>
</html>

LoginServlet如下:

package cn.com;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * session使用示例:
 * 用户登录与注销
 */
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 7723529540773218967L;
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		// 利用Cookie保存JSESSIONID并将其返回至浏览器
		HttpSession session=request.getSession();
		Cookie cookie = new Cookie("JSESSIONID", session.getId());
		cookie.setMaxAge(60 * 30);
		cookie.setPath(request.getContextPath());
		response.addCookie(cookie);
		//获取请求参数
		String contextPath = request.getContextPath();
		String username = request.getParameter("username");
		String password = request.getParameter("password");
          //假设正确的用户名是tom密码是123
		if (("tom").equals(username) && ("123").equals(password)) {
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			session.setAttribute("user", user);
			response.sendRedirect(contextPath+"/WelcomeServlet");
		} else {
			//登录失败重定向至登录页面
			response.sendRedirect(contextPath+"/login.html");
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		doGet(request, response);
	}
}

WelcomeServlet如下:

package cn.com;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class WelcomeServlet extends HttpServlet {
	private static final long serialVersionUID = -7790874606271048198L;
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String contextPath = request.getContextPath();
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("user");
		if (user == null) {
			String url = contextPath+"/login.html";
			response.getWriter().print("欢迎您,但是您还没有登录,请<a href='"+url+"'>登录</a>");
		} else {
			response.getWriter().print("您已登录,欢迎你," + user.getUsername() + "!");
			String url = contextPath+"/LogoutServlet";
			response.getWriter().print("<a href='"+url+"'>退出登录</a>");
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		doGet(request, response);
	}
}

LogoutServlet如下:

package cn.com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 *
 */
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = -2142465518612017585L;
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		String contextPath = request.getContextPath();
		//从Session中移除数据
		request.getSession().removeAttribute("user");
		//退出登录后重定向至登录页面
		response.sendRedirect(contextPath+"/login.html");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		doGet(request, response);
	}
}

User如下:

package cn.com;

import java.io.Serializable;
/**
 * 
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 *
 */
public class User implements Serializable{
	private static final long serialVersionUID = 8258403317602485452L;
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}	
}

web.mxl如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Session04</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
   <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.com.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>LoginServlet</servlet-name>
   <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>cn.com.LogoutServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>LogoutServlet</servlet-name>
   <url-pattern>/LogoutServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>WelcomeServlet</servlet-name>
    <servlet-class>cn.com.WelcomeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>WelcomeServlet</servlet-name>
   <url-pattern>/WelcomeServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

购物车

index.html代码如下:

<!DOCTYPE html>
<!-- 本文作者:谷哥的小弟-->
<!-- 博客地址:https://blog.csdn.net/lfdfhl-->
<html>
	<head>
		<meta charset="utf-8">
		<title>index</title>
	</head>
	<body>
	    <h2  style="color: red;">本文作者:谷哥的小弟</h2>
		<h2  style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
		<a href="/Session03/BookListServlet">开始购物</a>
	</body>
</html>

index.html页面如下:

流程分析:

  • BookListServlet负责从数据库查询出商品并展示,用户可点击每件商品的超链接进行购买
  • PurchaseServlet负责处理商品的购买,将已购商品存放至购物车
  • ShoppingCartServlet负责展示购物车中所有已购商品

Book如下:

package cn.com;

import java.io.Serializable;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Book implements Serializable {
	private static final long serialVersionUID = -7705519338429624216L;
	private String id;
	private String name;

	public Book() {
	}

	public Book(String id, String name) {
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

BookDB如下:

package cn.com;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * BookDB保存所有商品
 * 
 */
public class BookDB {
	private static Map<String, Book> booksHashMap = new LinkedHashMap<String, Book>();
	static {
		booksHashMap.put("1", new Book("1", "《倾城之恋》"));
		booksHashMap.put("2", new Book("2", "《曾国藩传》"));
		booksHashMap.put("3", new Book("3", "《三国演义》"));
		booksHashMap.put("4", new Book("4", "《儒林外史》"));
		booksHashMap.put("5", new Book("5", "《梦的解析》"));
	}

	public static Collection<Book> getAllBook() {
		return booksHashMap.values();
	}

	public static Book getBookByID(String id) {
		return booksHashMap.get(id);
	}
}

BookListServlet如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * 该Servlet用于展示所有商品
 * 
 */
public class BookListServlet extends HttpServlet {
	
	private static final long serialVersionUID = 2719186860052251283L;
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		// 利用Cookie保存JSESSIONID
		HttpSession session=request.getSession();
		Cookie cookie = new Cookie("JSESSIONID", session.getId());
		cookie.setMaxAge(60 * 30);
		cookie.setPath(request.getContextPath());
		response.addCookie(cookie);
		String contextPath=request.getContextPath();
		PrintWriter writer = response.getWriter();
		//获取并展示所有图书
		Collection<Book> books = BookDB.getAllBook();
		writer.write("本商铺在售图书如下:<br><br>");
		for (Book book : books) {
			String url = contextPath+"/PurchaseServlet?id=" + book.getId();
			String name = book.getName();
			writer.write(name + "<a href='" + url + "'>点击购买</a><br>");
		}
	}
}

PurchaseServlet如下:

package cn.com;

import java.io.IOException;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * 该Servlet用于购买商品
 * 
 */
public class PurchaseServlet extends HttpServlet {

	private static final long serialVersionUID = -3467781958637411074L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String contextPath = request.getContextPath();
		String id = request.getParameter("id");
		if (id == null) {
			String url = contextPath + "/BookListServlet";
			response.sendRedirect(url);
		} else {
			Book book = BookDB.getBookByID(id);
			//获取session
			HttpSession session = request.getSession();
			//从session中获取购物车
			ArrayList<Book> shoppingCart = (ArrayList<Book>) session.getAttribute("shoppingCart");
			if (shoppingCart == null) {
				//假若购物车为空则创建购物车并将其保存至session
				shoppingCart = new ArrayList<Book>();
				session.setAttribute("shoppingCart", shoppingCart);
			}
			//将商品添加至购物车
			shoppingCart.add(book);
			//重定向至购物车页面
			String url = contextPath + "/ShoppingCartServlet";
			response.sendRedirect(url);
		}

	}
}

ShoppingCartServlet如下:

package cn.com;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * 该Servlet用于展示购物车中已购商品
 * 
 */
public class ShoppingCartServlet extends HttpServlet {
	private static final long serialVersionUID = -4380967100623374134L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter writer = response.getWriter();
		ArrayList<Book> shoppingCart = null;
		boolean hasPurchaseBook = true;
		HttpSession session = request.getSession(false);
		if (session == null) {
			hasPurchaseBook = false;
		} else {
			// 获得用户购物车
			shoppingCart = (ArrayList<Book>) session.getAttribute("shoppingCart");
			if (shoppingCart == null) {
				hasPurchaseBook = false;
			}
		}
		
		if (!hasPurchaseBook) {
			writer.write("您还没有购买任何商品!<br>");
		} else {
			writer.write("您购买的图书有:<br><br>");
			for (Book book : shoppingCart) {
				String name = book.getName();
				writer.write(name + "<br>");
			}
		}
	}
}

web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Session03</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>ShoppingCartServlet</servlet-name>
    <servlet-class>cn.com.ShoppingCartServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>ShoppingCartServlet</servlet-name>
   <url-pattern>/ShoppingCartServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>BookListServlet</servlet-name>
    <servlet-class>cn.com.BookListServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>BookListServlet</servlet-name>
   <url-pattern>/BookListServlet</url-pattern>
  </servlet-mapping>
  
   <servlet>
    <servlet-name>PurchaseServlet</servlet-name>
    <servlet-class>cn.com.PurchaseServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>PurchaseServlet</servlet-name>
   <url-pattern>/PurchaseServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

结果如下:



转载:https://blog.csdn.net/lfdfhl/article/details/101751463
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场