会话以及会话管理技术

本文详细介绍了会话的概念,包括Cookie和Session两种主要的会话管理技术。Cookie是客户端技术,用于保存会话数据并在浏览器与服务器间传递。Session是服务器端技术,保存用户会话数据并基于Cookie实现。文中还讲解了Cookie和Session的API用法,如设置生命周期、路径和域名,以及Session超时管理和购物车、用户登录的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、会话概括

1、什么是会话:从登录淘宝,多次刷新网页,到最终退出淘宝,整个过程就是一次会话。
会话的特点:
包含多个请求,一次完整的会话针对一个用户。
会话管理技术:
第一种:cookie技术,客户端技术。
第二种:session技术,服务端技术。

二、Cookie对象

1、什么是cookie:
Cookie是一种会话管理技术,它是用来保存会话过程中产生的数据,然后在浏览器和服务器交互时,会使用cookie里面保存的数据。

    注意:首次访问服务器,浏览器不会携带cookie到服务端。

2 、Cookie常用的API
1.构造方法:

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

1.得到cookie对象:Cookie cookie = new Cookie(String key,String value);
2.Cookie类常用的方法:
2.回写(响应)cookie到浏览器端: response.addCookie(cookie);
3.得到cookie的名称 :String key= cookie.getName(),
得到cookie的值: String value =cookie.getValue();
4.给cookie设置生命时长: setMaxAge(int sr);
比如:cookie.setMaxAge(606024*7),说明cookie能存活7天;
cookie分类:
第一类:会话级别cookie,浏览器关闭,cookie对象就销毁了。
第二类:持久化cookie,通过setMaxAge这个方法来设置。
5.给cookie设置路径,设置域名:
setPath(路径的url),setDomain(域名);
比如:域名就是服务器名称,比如说:www.baidu.com
6.得到cookie: Cookie[] cookies = request.getCookies();

@WebServlet("/lastaccess")
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("test/html;charset=utf-8");
     System.out.println("收到前段请求");
     Cookie[] cookies=request.getCookies();
     String lastTime=null;
     for(int i=0;cookies!=null&&i<cookies.length;i++) {
         String name =cookies[i].getName();
         if("k=lastAccers".equals(name)) {
        	 lastTime=cookies[i].getValue();
         }
     }
     if(lastTime==null) {
    	 response.getWriter().print("您是首次访问本网站");
    	 
     }else {
    	 response.getWriter().print("您上次的访问时间"+lastTime);
    	 
     }
     String time=String.format("%tF%<tT",new Date());
     Cookie cookie=new Cookie("lastAccerss",time);
     cookie.setMaxAge(60*60*24*7);
     response.addCookie(cookie);
     
    		 }

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

}

在这里插入图片描述

在这里插入图片描述

3. Session对象
1.1 什么是session
session是一种会话管理技术,session用来保存会话过程中的数据,保存的数据存储到服务器端。
session原理:基于cookie实现的,更确切的说是基于会话级别的cookie实现的。
1.2 HttpSession API
session常用方法:
>>> 1.得到session的id(JESSIONID对应的值): getId();
>>> 2.设置session的生命时长:setMaxInactiveInterval(int interval)
>>> 3.销毁session: invalidate();
得到session: HttpSession session = getSession();
session域对象:作用范围一次完整的会话(包含多个请求)
>>> 1.存值: setAttribute(String key,Object obj);
>>> 2.取值: Object obj =getAttribute(String key);
>>> 3.移除: removeAttribute(String key);
总结域对象:request域对象 session域对象 servletContext域对象,作用范围以次变大。
request域对象:作用范围一次请求,通常和转发操作配合使用
session域对象:作用范围一次会话,通常和重定向操作配合使用
servletContext域对象:作用范围整个项目,和重定向、转发操作都可以配合使用.
1.3 Session 超时管理
session对象是有生命时长的,它的默认存活时间是30分钟
1.4 实现购物车:
1.创建Book封装图书信息:Book
2.创建BookDB,模拟数据库,里面保存图书
3.提供图书的购买页面:ListBookServlet
4.添加购物车:PurcharseServlet
5.回显购物车图书信息:CartServlet

   如果浏览器禁用了cookie,咱们的购物车功能就不能实现了,因为session是基于cookie实现的。
   解决方案:提示用户开启cookie.

1.5 实现用户登录
1.创建一个User类,封装用户名和密码
2.提供一个首页面,欢迎用户登录:IndexServlet,提供一个退出的链接。
3.提供一个登录的servelt:处理登录请求
4.提供一个退出的servlet:处理退出首页面的请求。
登录里面加入验证码:
得到验证码:参考图(验证码图片)
创建一个PurchaseServletListBookServletServlet.java。

@WebServlet({ "/PurchaseServlet", "/purchase" })
public class PurchaseServlet 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.setContentType("textml;charset=utf-8");
		//response.getWriter().append("Served at: ").append(request.getContextPath());
        String id=request.getParameter("id");
        if(id==null) {
        	String url="/hello/ListBookServlet";
        	response.sendRedirect(url);
        	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("JSESSIONID",session.getId());
        cookie.setMaxAge(60*60*24);
        cookie.setPath("/hello");
        response.addCookie(cookie);
        response.sendRedirect("/hello3/CartServlet");
	}

	/**
	 * @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("/listbook")
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");
		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='chapter01/puicharse?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);
	}

}

在这里插入图片描述
他们是有Book类和BookDB类封装的
Book类

public class Book implements Serializable{
private static final long serialVersionUIF=1L;
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;
}
}

BookBD类

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



CatServlet.java该类用于展示用户已经购买的图书列表

@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=true;
		if(session==null) {
			cartFlag=false;
		}else {
			cart =(List<Book>)session.getAttribute("cart");
			if (cart==null) {
				cartFalg=false;
			}
		}
		if(!cartFlag) {
			out.print("对不起,你的购物车里面没有图书,请去购买");
			
		}else {
			out.print("购买图书如下:"+"<br/>");
			for(Book b:cart) {
				out.print("购买的图书:"+b.getName()+"<br/>");
	

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值