会话以及会话管理技术

本文介绍了会话管理和常见的会话技术,如Cookie和Session。在购物车案例中,详细阐述了如何利用Session保存用户购买的商品信息,并探讨了在浏览器禁用Cookie时的解决方案。此外,还展示了如何通过Servlet实现添加购物车和查看购物车的功能。
摘要由CSDN通过智能技术生成

会话以及会话管理技术
1.会话概述:
什么是会话:从登录淘宝,多次刷新网页,到最终退出淘宝,整个过程就是一次会话。
会话的特点:包含多个请求,一次完整的会话针对一个用户。
会话管理技术:
第一种:cookie技术,客户端技术。
第二种:session技术,服务端技术。
购物车案列:买完商品后,加入购入车,买的商品存到什么对象比较合适?
1.使用request域对象保存商品信息:
结论:使用request保存商品信息不可以,因为每次发送请求,都会产生一个新的请求对象。
2.使用ServletContext域对象保存商品信息
结论:使用ServletContext对象保存商品信息,可以,但是不合理。
所以在开发中,保存会话过程中产生的数据,采用会话管理技术,也就是使用cookie和session技术
来保存会话过程产生的数据。
2.Cookie对象
1.1 什么是cookie:
Cookie是一种会话管理技术,它是用来保存会话过程中产生的数据,然后在浏览器和服务器交互时,
会使用cookie里面保存的数据。
注意:首次访问服务器,浏览器不会携带cookie到服务端。

1.2 Cookie常用的API
    1.构造方法:
	    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(60*60*24*7),说明cookie能存活7天;
	       cookie分类:
		第一类:会话级别cookie,浏览器关闭,cookie对象就销毁了。
		第二类:持久化cookie,通过setMaxAge这个方法来设置。
	    5.给cookie设置路径,设置域名:
	      setPath(路径的url),setDomain(域名);
	      比如:域名就是服务器名称,比如说:www.baidu.com
	    6.得到cookie: Cookie[] cookies = request.getCookies();

 1.3 显示用户的上次访问时间:
    实现步骤:
    1.判断是否是首次访问:
        如果cookie里面有时间,说明就不是第一次访问。
    2.如果是第一次访问,创建cookie,保存时间,把这个cookie回写到浏览器端。
    3.如果不是第一次访问,把时间回写到浏览器,记住当前时间,把时间保存cookie里面。
  1. 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分钟。
    具体配置找tomcat软件的conf目录下的web.xml文件,如下:

    30

    立即销毁session对象:invalidate();

    1.4 实现购物车:
    1.创建Book封装图书信息:Book

package session;

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

}

   2.创建BookDB,模拟数据库,里面保存图书
package 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);
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}

   3.提供图书的购买页面:ListBookServlet
package 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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "Servlet3", value = "/Servlet3")
public class Servlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
//        Collection<Book> books=BookDB.getAll();
        Collection<Book> books=BookDB.getAll();
        PrintWriter out=response.getWriter();
        out.print("20200806050010 刘杰"+"<br/>");
        out.print("本网站售卖的书籍如下");

        for (Book b:books){
            String name = b.getName();
            String id = b.getId();
            String url="<a href='/day6_cookie_war_exploded/Servlet4?id="+id+"'>点击购买<a/>";
            out.print("图书名称:"+name+"    "+url+"<br/><br/>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

   4.添加购物车:PurcharseServlet
package 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;

@WebServlet(name = "Servlet4", value = "/Servlet4")
public class Servlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        String id = request.getParameter("id");
        if (id==null){
            response.sendRedirect("/chapter05/Servlet");
            return;
        }
        session.Book book =BookDB.getBook(id);
//        Book book = BookDB.getBook(id);
        //用session来实现购物车
        HttpSession session = request.getSession();
        List<session.Book> list=(List<session.Book>) session.getAttribute("cart");
//        List<Book> list=(List<Book>) session.getAttribute("cart");
        if (list==null){
            list=new ArrayList<Book>();
            session.setAttribute("cart",list);
        }
//        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/Servlet");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

   5.回显购物车图书信息:CartServlet
package 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;

@WebServlet(name = "Servlet5", value = "/Servlet5")
public class Cart extends HttpServlet {
    @Override
    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 (session.Book b:cart){
                out.print("购买图书:"+b.getName()+"<br/>");
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

   如果浏览器禁用了cookie,咱们的购物车功能就不能实现了,因为session是基于cookie实现的。
   解决方案:提示用户开启cookie.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值