JavaWeb-05 会话及其会话技术

本文介绍了如何在Java Web应用中使用Cookie对象来显示用户上次访问时间,以及利用Session对象实现购物车功能。示例包括创建Servlet、处理用户登录、购物车添加商品等,详细讲解了Cookie和Session的相关API及其实现过程。

目录

Cookie对象

实例:显示用户上次访问时间

Session对象

实例:实现购物车

                                                                                                           

 任务:实现用户登录 

1.创建封装用户信息类

2.创建Servlet

3.创建登陆页面

4.启动项目,查看结果


Cookie对象

Cookie类的常用方法
功能描述方法声明
String getName()用于返回Cookie 的名称
void setValue(String newValue)用于为Cookie设置一个新的值
String getValue()用于返回 Cookie的值
void setMaxAge(int expiry)用于设置Cookie在浏览器客户机上保持有效的秒数
int getMaxAge()用于返回Cookie在浏览器客户机上保持有效的秒数
void setPath(String uri)用于设置该Cookie项的有效目录路径
String getPath()用于返回该Cookie 项的有效目录路径
void setDomain(String pattern)用于设置该Cookie项的有效域
 String getDomain()用于返回该Cookie 项的有效域
void setVersion(int v)用于设置该Cookie 项采用的协议版本
int getVersion()用于返回该Cookie 项采用的协议版本
void setComment(String purpose)用于设置该Cookie项的注解部分
String getComment()用于返回该Cookie 项的注解部分
void setSecure(boolean flag)用于设置该Cookie项是否只能使用安全的协议传送
boolean getSecure()用于返回该Cookie项是否只能使用安全的协议传送

实例:显示用户上次访问时间

1.创建Servlet
在Eclipse中新建Web项目chapter05,并在该项目下新建一个名称为pidan.cookie.example的包,在该包中编写一个名称为LastAccessServlet的Servlet类,用于实现获取 Cookie信息并将当前时间作为Cookie 值发送给客户端。

package pidan.cookie.example;

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 LastAccessServlet
 */
@WebServlet("/LastAccessServlet")
public class LastAccessServlet 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("lastccess".equals(name)) {
				lastTime=cookies[i].getValue();
			}
		}
		if(lastTime==null) {
			response.getWriter().print("第一次访问本网站!");
		}else {
			response.getWriter().print("上次访问的时间是:"+lastTime);
			response.getWriter().print("学号:2020080604029");
		}
		String time=String.format("%tF%<tT", new Date());
		Cookie cookie=new Cookie("lastccess", time);
		Cookie cookie1 = new Cookie("dashuju", "2004");
		response.addCookie(cookie);
		response.addCookie(cookie1);
	}

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

}

由于这里直接通过 @WebServlet 标签配置URL映射,不再需要从 web.xml 里面配置 servlet。

启动Tomcat 服务器,在浏览器的地址栏中输入 localhost:8080/chapter05/LastAccessServlet”访问 LastAccessServlet,由于是第一次访问LastAccessServlet:

重新访问地址(刷新页面):

Session对象

HttpSession接口中的常用方法
方法声明功能描述
String getld()用于返回与当前HttpSession对象关联的会话标识号
long getCreationTime()返回 Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
long getLastAccessedTime()返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
void setMaxlnactivelnterval(int interval)用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔
boolean isNew()判断当前HttpSession对象是否是新创建的
void invalidate()用于强制使Session对象无效
ServletContext getServletContext()用于返回当前HttpSession对象所属于的Web应用程序对象,即代表当前Web应用程序的ServletContext对象
void setAttribite(String name,Object value)用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
String getAttribute()用于从当前HttpSession对象中返回指定名称的属性对象
void removeAttribute(String name)用于从当前HttpSession对象中删除指定名称的属性

实例:实现购物车

新建一个名称为pidan.session.example01的包,在该包中创建一个名称为Book的类,该类用于封装图书的信息,其中定义了id和name属性,分别用来表示书的编号和名称。

package pidan.session.example01;

public class Book {
	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;
	}
}

在pidan.session.example01包中创建一个名称为BookDB的类,该类用于模拟保存所有图书的数据库。

package pidan.session.example01;

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);
	}
}

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

package pidan.session.example01;

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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class BookDB
 */
@WebServlet("/ListBookServlet")
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 {
		response.setContentType("text/html;charset=utf-8");
		//1,
		Collection <Book> books= BookDB.getAll();
		
		PrintWriter out=response.getWriter();
		
		out.print("本网站售卖的书籍:"+"<br/><br/>");
		
		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);
	}

}

创建一个名称为PurchaseServlet的Servlet类

package pidan.session.example01;

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;

@WebServlet("/purcharse")
public class purcharseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String id=request.getParameter("id");
		System.out.println("id :"+id);		
		if(id==null) {
			response.sendRedirect("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("cart");
	}

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

}

创建一个名称为CartServlet的Servlet类,该类主要用于展示用户已经购买的图书列表

package pidan.session.example01;

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;



@WebServlet("/cart")
public class CartServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		List<Book> cart=null;
		HttpSession session = request.getSession(false);
		boolean cartFlag=true;
		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/>");
			}
		}
	}

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

}

启动Tomcat 服务器,访问ListBookServlet,

单击图中“javaweb开发”后的“点击购买”链接,

再次访问(或点击浏览器的返回上一页)ListBookServlet,选择“jdbc开发”后的“点击购买”链接


                                                                                                           

 任务:实现用户登录 

 实现效果:

        用户登录的整个流程,当用户访问某个网站的首界面时,首先会判断用户是否登录,如果已经登录则在首界面中显示用户登录信息,否则进入登录页面,完成用户登录功能,然后显示用户登录信息。在用户登录的情况下,如果单击用户登录界面中的“退出”时,就会注销当前用户的信息,返回首界面。

1.创建封装用户信息类

在chapter05项目的src下新建一个名称为pidan.session.example02的包,在包中编写一个名称为User的类,User类中包含username和password两个属性以及其getter和setter方法

package pidan.session.example02;

public class User {
	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;
	}
}

2.创建Servlet

在pidan.session.example02包中编写IndexServlet 类, 该Servlet 用于显示网站的首界面

package pidan.session.example02;

import java.io.IOException;
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;

@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		HttpSession session= request.getSession();
		User user =(User) session.getAttribute("user");
		if(user==null) {
			response.getWriter().print("您还没登录,请<a href='login.html'>登录</a>");
		}else {
			response.getWriter().print("你已登录,欢迎你,"+user.getUsername()+"!");
			response.getWriter().print("<a href='LogoutServlet'>退出</a>");
			Cookie cookie =new Cookie("JSESSIONID", session.getId());
			cookie.setMaxAge(60*30);
			cookie.setPath("/chapter05");
			response.addCookie(cookie);
		}
	}

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

}

在pidan.session.example02包中编写LoginServlet,该Servlet用于显
示用户登录成功后的界面

package pidan.session.example02;

import java.io.IOException;
import java.io.PrintWriter;

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

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		PrintWriter pw=response.getWriter();
		if(("pidan").equals(username)&&("666").equals(password)) {
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			request.getSession().setAttribute("user", user);
			response.sendRedirect("IndexServlet");
		}else {
			pw.write("用户名或密码错误,登录失败");
		}
	}

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

}

在pidan.session.example02包中编写LogoutServlet,该Servlet用于完
成用户注销功能,当用户单击【退出】时,该类会将Session对象中的用户信息移除,并跳
转到网站的首界面。

package pidan.session.example02;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getSession().removeAttribute("user");
		response.sendRedirect("IndexServlet");
	}

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

}

3.创建登陆页面

在chapter05项目的WebContent目录下创建一个名称为login.html的页面,该页面中包含用户登录表单信息

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form name="reg" action="/chapter05/LoginServlet" method="post">
		用户名:<input name="username" type="text" /><br/>
		密__码:<input name="password" type="password" /><br/>
		<input type="submit" value="提交" id="bt" />
	</form>
</body>
</html>

4.启动项目,查看结果

启动Tomcat服务器,在浏览器访问login.html

 在图中的用户名和密码输入框中输入用户名“pidan”和密码“666”后,单击【提交】按钮

如果用户想退出登录,可以单击“退出”:

 但如果用户输入的用户名或者密码错误,那么,当单击【提交】按钮时,登录会失败,浏览器会显示:

Java Web中,会话指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应的过程,例如一个用户在某网站上的整个购物过程就是一次会话,其特点是包含多个请求,且一次完整的会话针对一个用户 [^1][^2]。 会话技术是在Web开发中,服务器跟踪用户信息的技术,主要包括Cookie技术和Session技术,前者属于客户端技术,后者属于服务端技术 [^2]。 基于Cookie的会话跟踪技术,其会话信息在浏览器关闭后仍然存在,可以通过设置Cookie的expires属性控制其有效期。而基于Session的会话跟踪,浏览器首次请求服务器时,若第一次请求Session,服务器会自动创建一个会话对象Session,每个会话对象Session都有一个ID,即Session的ID。并且Session会话跟踪技术会话信息只在用户在网站上活动时存在,在用户关闭浏览器后会话信息会被删除 [^3]。 Tomcat服务收到用户发送过来的请求报文后,会根据其携带的Cookie中的会话ID,来找到之前对应的、记录着客户端状态信息的Session对象,这样服务端就可以根据Session对象中记录的用户的信息来做相应的逻辑处理并做出响应 [^4]。 以下是使用Java代码简单演示如何使用Session: ```java 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; import java.io.IOException; @WebServlet("/sessionExample") public class SessionExampleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取Session对象,如果不存在则创建 HttpSession session = req.getSession(true); // 设置Session属性 session.setAttribute("username", "JohnDoe"); // 获取Session属性 String username = (String) session.getAttribute("username"); resp.getWriter().println("Username from session: " + username); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值