JAVAWeb(会话以及会话管理技术)—— ——Cookie和Session

Javaweb(会话以及会话管理技术)

学习目标:
什么是Cookie,掌握Cookie对象的使用
什么是Session,掌握Session对象的使用



前言

一、会话概述

Web应用中的会话类似于生活的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间的连续发生的一系列请求响应过程,例如一个用户在网站上的一整个购物过程就是一个会话。

Cookie对象

1.1什么是Cookie

类似于商场中办理的会员卡,每次去商场都能通过这张卡来识别你的用户信息,并对你的消费记录。这样,当该浏览器再次访问服务器的时候,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
服务向客户端发送Cookie时,会在HTTP响应字段中增加Set-Cookie响应字段。
Set-Cookie头字段中设置的Cookie遵循一定语法格式,具体示例如下:
Set-Cookie: user=itcast; path=/ ;
user表示Cookie的名称,itcast表示Cookie的值,Path表示Cookie的属性。

1.2为什么要Cookie

因为HTTP协议是无状态的,对于一个浏览器发出的请求,服务器无法区分是不是同一个来源,无法知道上一次用户做了什么。所以,需要额外的数据用于维护会话。 Cookie 正是这样的一段随HTTP请求一起被传递的额外数据,用于维护浏览器和服务器的会话。

1.3 Cookie API

为了封装Cookie信息,在Serlet API中提供了一个javax. serttp.Cooke类,该类包含了生成Cookie信息和提取Cookie信息各个属性的方法。Cookie的构造方法和常用方法具体

1.构造方法
Cookie类有且仅有-一个构造方法,具体语法格式如下。

public Cookie (java.lang.String name, java.lang .String value)

在Cookie的构造方法中,参数name用于指定Cookie的名称,value 用于指定Cookie的值。需要注意的是,Cookie 一旦创建,它的名称就不能更改,Cookie 的值可以为任何值,创建后允许被修改。
[任务5-1 ]显示用户上次访问时间

[任务目标]

当用户访问某些Web应用时,经常会显示出该用户上-次的访问时间。例如,QQ登录成功后,会显示用户上次的登录时间。通过本任务,读者将学会如何使用Cookie技术实现显示用户上次的访问时间的功能。

[实现步骤]
1.创建Servlet

在Eclipse中新建Web项目chapter05 ,并在该项目下新建-一个 名称为cn.itcast.chapter05.cookie.example的包,在该包中编写一个名称为LastAccessServlet的Servlet类,该类主要用于实现获取Cookie信息并将当前时间作为Cookie值发送给客户端。LastAccessServlet 类的具体实现代码如下所示。
** LastAccessServletjava**

package cn.itcast.chapter05.cookie;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/

Servlet implementation class LastAcess
/
@WebServlet("/last")
public class LastAcess extends HttpServlet {
    
    
private static final long serialVersionUID = 1L;
/*
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
response.setContentType(“text/html;charset=utf-8);
Cookie[] cookies=request.getCookies();

String lasttime=null;
for(int i=0;cookies!=null&&i<cookies.length;i++) {
    
    
String name=cookies[i].getName();
if(“lastAccess”.equals(name)) {
    
    
lasttime=cookies[i].getValue();
}
}
if(lasttime==null) {
    
    
response.getWriter().print(“你是第一次访问本网站”);
}else {
    
    
response.getWriter().print(“你是第一次访问的时间是:+lasttime);

 }
1
String time = String.format("%tF%<tT", new Date());
Cookie cookie= new Cookie(“lastAccess”,time);
Cookie cookie2=new Cookie(“lastAccess”,123);
response.addCookie(cookie);
response.addCookie(cookie2);
}
/**

@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);
}
}
example
package cn.itcast.chapter05.session;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*

Servlet implementation class example
/
@WebServlet("/example")
public class example extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String time = String.format("%tF%<tT", new Date());
Cookie cookie= new Cookie(“lastAccess”,time);
Cookie cookie2=new Cookie(“lastAccess”,“123”);
response.addCookie(cookie);
response.addCookie(cookie2);
}
/*
@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);
}
}*

二、Session对象

Cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但是,如果传递的信息比较多,使用Cookie技术显然会增大服务器端程序处理的难度,这时,可以使用Session技术。Session 是-种将会话数据保存到服务器端的技术。接下来,本节将针对Session进行详细的讲解。

2.1创建封装图书信息类

在chapter05项目下新建一一个名称为cn.itcast.chapter05 .session.example01的包,在该包中创建一个名称为Book的类,该类用于封装图书的信息,其中定义了id 和name属性。分别用来表示书的编号和名称。其实现代码如文件5-2所示。

Book的java类

Book.java

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的java类

创建数据库模拟类
cn.itcast.chapter05. session.example01包中创建一个名为 BookDB拟保存所有图书的数据库。
BookDB.java



package cn.itcast.chapter05.session;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

public class BookDB {
    
    
private static Map<String,Book> map = new LinkedHashMap<String,Book>();
static{
    
    
map.put(1, new Book(1,“javaWeb”));
map.put(2, new Book(2,“jdbc入门”));
map.put(3, new Book(3,“java基础”));
map.put(4, new Book(4,“struts框架”));
map.put(5, new Book(5,“hibernate框架”));

}
//1.得到所有图书
public static Collection<Book> getAll(){
    
    
	return map.values();
}
//2.根据map的key,也就是图书的id,得到某本图书
public static Book getBook(String id){
    
    
	return map.get(id);
}

创建Servlet
( 1)创建一个名称为ListBookServlet的Servlet类,该Servlet用于显示所有可购买图书的列表,通过单击“购买”链接,便可将指定的图书添加到购物车中。其实现代码如下所示。

ListBookServlet的Servlet类

package cn.itcast.chapter05.session;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=utf-8");
		Cookie[] cookies =request.getCookies();
		
		Collection<Book> books=BookDB.getAll();
		
		PrintWriter out = response.getWriter();
		out.print("本网站售卖的书如下:");
		
		for(Book b:books) {
    
    
			String name= b.getName();
			String id=b.getId();
			String url="<a href='purcharse?id="+id+"'>点击购买</a>";
			out.print("图书名称:"+name+" "+url+"<br/><br/>");			
		}
	}

	/**
	 * @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);
	}

}

(2)创建一个 名称为PurchaseServlet的Servlet类,其实现代码。

PurchaseServlet的Servlet类

package cn.itcast.chapter05.session;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

/**
 * Servlet implementation class PucharseServlet
 */
@WebServlet("/purcharse")
public class PucharseServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PucharseServlet() {
    
    
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=utf-8");
		String id=request.getParameter("id");
		if(id==null){
    
    
			response.sendRedirect("/chapter05/list");
			return;
		}
		Book book =BookDB.getBook(id);
		
		HttpSession session=request.getSession();
		
		List<Book> list=(List<Book>) session.getAttribute("cart");
		if(list==null) {
    
    
			list=new ArrayList<Book>();
			session.setAttribute("cart", list);
		}
		
		list.add(book);
		
		Cookie cookie = new Cookie("JESSIONID", session.getId());
		response.addCookie(cookie);
		response.sendRedirect("/chapter05/cart");
	}

	/**
	 * @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);
	}

}

以上实现了两个功能,一一个是将用户购买的图书信息保存到Session对象中:一个是在用户购买图书结束后,将页面重定向到用户已经购买的图书列表。该类在实现时,通过ArrayList集合模拟了一个购物车,然后将购买的所有图书添加到购物车中,最后通过Session对象传递给CartServlet,由CartServlet 展示用户已经购买的图书。

(3)创建一一个名称为CartServlet的Servlet类,该类主要用于展示用户已经购买的图书列表,其实现代码。

CartServlet的Servlet类

package cn.itcast.chapter05.session;

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

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 CartServlet
 */
@WebServlet("/cart")
public class CartServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		List<Book> cart=null;
		HttpSession session = request.getSession(false);
		boolean cartflag=false;
		if(session==null) {
    
    
			cartflag=false;
		}else {
    
    
			cart=(List<Book>)session.getAttribute("cart");
			if(cart==null) {
    
    
				cartflag=false;
			}
		}
		if(!cartflag) {
    
    
			out.print("对不起,请前往购买图书");
		}else {
    
    
			
			out.print("购买图书如下:"+"<br/>");
			for(Book b:cart) {
    
    
				out.print("购买图书:"+b.getName()+"<br/>");
			}
		}
		
		
	}

	/**
	 * @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);
	}

}

4.运行项目,查看结果

在web.xml中对相应的Servlet进行配置,然后启动Tomcat服务器,在浏览器中输入地址http://ocalhost:9999/chapter05/ListBookServlet”访问ListBookServlet,浏览器显示的结果如
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_54405545/article/details/121284155