5.Cookie & Session

Cookie & Session

Cookie

饼干,其实是一份小数据,是服务器给客户端,并且存储在客户端上的一份数据

应用场景

自动登录、浏览记录、购物车

为什么需要Cookie

http的请求时无状态的,即客户端与服务器在通讯的时候是无状态的,服务器不知道客户端以前是否来访过。
为了更好的用户体验,更好的交互[自动登陆],从公司层面讲,为了更好的手机用户习惯。

Cookie的使用

  • 简单使用
    • 添加和获取cookie
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  response.setContentType("text/html;charset=utf-8");
                  
                  //创建cookie对象
                  Cookie cookie = new Cookie("cookie_name","cookie_value");
                  
                  //给响应,添加一个cookie
                  response.addCookie(cookie);
      
                  //获取客户端带过来的cookie
                  Cookie[] cookies = request.getCookies();
                  if(cookies != null) {
                    for(Cookie c : cookies) {
                        String cookieName = c.getName();
                        String cookieValue = c.getValue();
                    }
                  }
        }
      
    • 设置有效期
            //关闭浏览器后,cookie就没有了--->在没有设置cookie有效期的情况下
            //expiry: 有效  --->以秒计算
            //正值:表示在这个数字过后,cookie将会消失
            //负值:关闭浏览器后,cookie将会消失,默认值为-1
            cookie.setMaxAge(60 * 60 * 24 * 7); //设置有效期为一周
      
    • 常用方法
      
            //可以给客户端返回多个cookie
            Cookie cookie1 = new Cookie("name","张三");
            Cookie cookie2 = new Cookie("age","18");
      
            //赋新的值
            cookie.setValue(newValue);
      
            //用于只有请求指定的的域名,才会带上cookie
            cookie.setDomain(".servlet.com");
      
            //只有访问该域名下的指定路径地址才会带cookie
            cookie.setPath("/CookieDemo");
      

例子1: 获取上一次访问时间

1.判断账号是否正确

2.若正确,则获取cookie,但得到的是一个数组,我们要从数组里面找到我们想要的对象

3.如果找到的对象为空,表明是第一次登陆,那么要添加cookie

4.如果找到的对象不为空,表明不是第一次登录,更新cookie

在这里插入图片描述

  • 从数组中获取需要的信息
          public class CookieUtil {
              public static Cookie findCookie(Cookie[] cookies,String name){
                if(cookies != null) {
                  for(Cookie cookie : cookies) {
                    if(name.equals(cookie.getName())){
                      return cookie;
                    }
                  }
                }
                return null;
              }
        }
    
  • 逻辑判断
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //账号正确
           if("admin".equals(userName) && "123".equals(password)) {
                 //获取cookie
                 Cookie [] cookies = request.getCookies();
                 //从数组里找到需要的cookie
                 Cookie cookie = CookieUtil.findCookie(cookies, "last_time");
    
                 //如果是第一次登录,没有cookie
                 if(cookie == null) {
                         //创建cookie
                         Cookie c = new Cookie("last_time",System.currentTimeMillis()+"");
                         c.setMaxAge(60*60);
                         response.addCookie(c);
                         //显示界面
                         response.getWriter().write("欢迎您,"+userName);
                 }else {
                         //第二次登录,有cookie
                         //获取上次登录时间
                         long lastVisitTime = Long.parseLong(cookie.getValue());
                         //显示界面
                         response.getWriter().write("欢迎您,"+userName+",上次来访的时间是:" + new Date(lastVisitTime));
                         //更新cookie,并返回
                         cookie.setValue(System.currentTimeMillis()+"");
                         response.addCookie(cookie);
                 }
               }
         }
    

例子2: 显示商品浏览记录

在这里插入图片描述

JSP 里面使用java代码

  • Java Server Pager —> 最终会翻译成一个类,就是一个Servlet
    • 定义一个全局变量
       <%! int a = 99; %>
      
    • 定义一个局部变量
       <% int b = 999; %>
      
    • 在jsp页面上,显示a 和 b的值
      <%=a %>
      <%=b %>
      
  • 浏览记录的展示和删除
    • jsp显示浏览记录
         <% 
                  Cookie [] cookies = request.getCookies();
                  Cookie cookie = CookieUtil.fildCookie(cookies,"histoy");
                  //如果cookies是空,表明没有浏览任何商品
                  if(cookie == null){
          %>
          
                  <h2>您还没有浏览任何商品<h2>
                  
          <%            
                  }else{
                    //不是空,表明有浏览记录,1#2#4
                    String[] ids = cookie.getValue().split("#");
                    for(String id : ids){
           %>
           
                     <img src="products/<%=id %>.jpg">
           <% 
           
                    }
                  }
           %>
      
    • 获取浏览记录
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //获取当前用户浏览的商品id
          String id = request.getParameter("id");
      
          Cookie[] cookies = request.getCookies();
          Cookie cookie = CookieUtil.findCookie(cookies, "history");
      
          //第一次浏览
          if(cookie == null) {
            //1.响应返回cookie
            Cookie c = new Cookie("history",id);
            //设置有效期
            c.setMaxAge(60*60*24);
            //设置只有在访问这个工程的时候才带cookie过来
            c.setPath("/CookieDemo01");
            response.addCookie(c);
          }else {
            //第二次
      
            //1.获取以前的cookie,因为以前的cookie,包含了浏览记录
            String ids = cookie.getValue();
            //设置有效期
            cookie.setMaxAge(60*60*24);
            //设置只有在访问这个工程的时候才带cookie过来
            cookie.setPath("/CookieDemo01");
            //2.让现在浏览的商品和以前浏览的商品,形成新的cookie
            cookie.setValue(id + "#" + ids);
            response.addCookie(cookie);
          }
          //3.跳转到指定页面
          response.sendRedirect("Product_info.html");
        }
      
    • 清除浏览记录
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //清除cookie
            Cookie cookie = new Cookie("history","");
            //设置立删除
            cookie.setMaxAge(0);	
            cookie.setPath("/CookieDemo01");
            response.addCookie(cookie);
            //返回指定页面
            response.sendRedirect("product_list.jsp");
          }
      

Session

会话,Session是基于Cookie的一种会话机制。Cookie是服务器返回一小份数据客户端,并且存放在客户端。Session的数据存放在服务器。

  • 常用API
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //得到会话ID
        String id =  session.getId();
        //存值
        session.setAttribute(name, value);
        //取值
        session.getAttribute(name);
        //移除值
        session.removeAttribute(name);
	}
  • Sessio何时创建,何时销毁
    • 创建

    若果在Servlet里面调用了request.getSession()

    • 销毁

    session 是存放在服务器的内存中的一份数据(当然可以持久化,Redis),即关闭了浏览器,session也不会销毁。

    • 销毁方法
      • 1.关闭服务器
      • 2.session会话时间过期,默认有效期:30分钟

例子3: 简单购物车

在这里插入图片描述

Servlet的实现

  • product.jsp
	<body>
		 <a href="CarServlet?id=0"><h3>Iphone7</h3></a><br>
		 <a href="CarServlet?id=1"><h3>小米6</h3></a><br>
		 <a href="CarServlet?id=2"><h3>三星Note8</h3></a><br>
		 <a href="CarServlet?id=3"><h3>魅族7</h3></a><br>
		 <a href="CarServlet?id=4"><h3>华为9</h3></a><br>
	</body>
  • CarServlet.java
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		//1.获取要添加到购物车的商品id
		int id = Integer.parseInt(request.getParameter("id")); //0,1,2,3,4
		String [] names = {"Iphone7","小米6","三星Note8","魅族7","华为9"};
		//获取id对应的商品名
		String name = names[id];
		
		//2.获取过无车存放东西的session,Map<String,integer>
		
		//把一个map对西乡存放到session里,并保证只保存一次
		Map<String,Integer> map = (Map<String,Integer>)request.getSession().getAttribute("cart");
		//如果session里面没有存放任何东西
		if(map == null) {
			//创建一个map
			map = new LinkedHashMap<String,Integer>();
			request.getSession().setAttribute("cart",map);
		}
		
		
		//3.判断购物车里有没有该商品
		if(map.containsKey(name)) {
			//在原来的值基础上 +1
			map.put(name, map.get(name) + 1);
		}else {
			//没有买过该商品,设当前值为1
			map.put(name, 1);
		}
		
		//4.输出界面(跳转)
		response.getWriter().write("<a href='product_list.jsp'><h3>继续购物<h3><br>");
		response.getWriter().write("<a href='cart.jsp'><h3>去购物车结算<h3>");
	}

展示购物车内容

  • cart.jsp
	<body>
	       <h2>您的购物车商品如下:</h2>

	       <%
		   //1.先获取到map
		   Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cart");

		   //遍历map
		   if(map != null){
			   for(String key : map.keySet()){
				   int value = map.get(key);
	      %>
		    <h3>名称:<%=key %>    数量: <%=value %></h3>
	      <% 
			   }
		   }

	       %>
	</body>

清空购物车

  • cart.jsp
<a href="ClearCartServlet"><h4>清空购物车</h4></a>
  • ClearCartServlet.java
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		//方法1:从session中移除某一个数据
		session.removeAttribute("cart");
		
		//方法2:强制干掉session,里面的所有数据将被清空
		session.invalidate();
		
		response.sendRedirect("cart.jsp");
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值