Cookie and Session 详细 例子等no12.

Cookie介绍

英文翻译饼干,其实他的意思是一小块数据,就像“饼干”那么小的数据。是服务器给 客户端,并且存放在客户端的数据。
应用场景:
自动登陆,浏览记录,购物车。
为什么要用cookie:
http协议都是无状态的。其实就是客户端在第二次登陆的时候,服务器根本就不知道这个客户端以前有没有来访问过,为了更好的用户体验,更好的交互【自动登陆】,对公司来说为了收集用户习惯。
怎么使用cookie:
列子:

package com.st.servlet;

import java.io.IOException;

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

public class Demo extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
		resp.setContentType("text/html;charset=UTF-8");
		
		Cookie cookie=new Cookie("aa", "bb");
		resp.addCookie(cookie);
		resp.getWriter().write("请求成功");
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

使用抓包工具抓包:
结果
在这里插入图片描述

怎么获取客户端带过来的cookie呢?
代码

package com.st.servlet;

import java.io.IOException;

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

public class Demo extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
		resp.setContentType("text/html;charset=UTF-8");
		
		//发送给cookie给客户端
		Cookie cookie=new Cookie("aa", "bb");
		
		//给相应添加一个客户端
		resp.addCookie(cookie);
		resp.getWriter().write("请求成功");
		
		//获取客户端带过来的数据
		Cookie[] cookies=req.getCookies();
		if (cookies!=null) {
			for(Cookie c:cookies) {
				String CookieName=c.getName();
				String CookieValue=c.getValue();
				System.out.println("cookiename is:"+CookieName+"cookievalue"+CookieValue);
				
				
			}
			
		}
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

结果
在这里插入图片描述

总结:

1.在响应的时候,添加cookie
Cookie cookie=new Cookie("aa", "bb"); resp.addCookie(cookie); resp.getWriter().write("请求成功");
2.客户端收到的信息里面,相应头多了一个字段Set-Cookie
3.获取客户端带过来的cookie

获取客户端带过来的数据
Cookie[] cookies=req.getCookies();
		if (cookies!=null) {
			for(Cookie c:cookies) {
				String CookieName=c.getName();
				String CookieValue=c.getValue();
				System.out.println("cookiename is:"+CookieName+"cookievalue"+CookieValue);
	}
} 

设置Cookie的有效期
下面这个方法:

//这个cookie的有效期。默认情况下关闭浏览器cookie就没有了
//expiry:有效以秒计算
//正值:表示在这个数字过后cookie将会失效
//负值:关闭浏览器zhegecookie就失效,默认值是-1

	cookie.setMaxAge(60*60);

Cookie相关的其他方法

	//赋值新的值
	//cookie.setValue(newValue);
	
	//用于指定只有请求的域名,才会带上该cookeie
	//cookie.setDomain("xxx.xxx.xxx给定域名");
			
	//只有访问该域名下的cookieDemo的这个路径才会带cookie
	//cookie.setPath("/CookieDemo");

Cookie例子:获取上次登陆时间

需求

在这里插入图片描述

思路:
在这里插入图片描述
新建例子如下
(里面的Demo.java是上次的 划掉)
在这里插入图片描述
login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="Demo2">
<h2>用户登陆</h2>
账号:<input type="text" name="username" /><br>
密码:<input type="text" name="password" /><br>
<input type="submit" value="登陆" />
</form>

</body>
</html>

把查找全部cookie写成一个工具类方便应用:

CookieUtil .java

package com.st.util;

import javax.servlet.http.Cookie;

public class CookieUtil {
	public static Cookie FiadAllCookie(Cookie[] cookies, String name) {
		
		
		//从一个数组中找到具体想要的cookie对象
		if (cookies!=null) {
			for (Cookie cookie : cookies) {
			
				if (name.equals(cookie.getName())) {
					return cookie;
					
				}
			}
			
		}
		return null;
		
		
		
	}

}

Demo2.java

package com.st.servlet;

import java.io.IOException;
import java.util.Date;

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

import com.st.util.CookieUtil;

public class Demo2 extends HttpServlet{
	@Override
	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");
		
		if ("admin".equals(username) && "123456".equals(password)) {
			
			
			//获取cookie last name
			Cookie[] cookies =request.getCookies();
			//从数组里面找出我们想要的cookie
			Cookie cookie=CookieUtil.FiadAllCookie(cookies, "last");
			
			//第一次登陆没有cookie
			if (cookie==null) {
				Cookie cookie1=new  Cookie("last", System.currentTimeMillis()+"");
				cookie1.setMaxAge(30*30);
				response.addCookie(cookie1);
				response.getWriter().write("欢迎你登陆成功!"+username);
				
			}else {
				//取以前的cookie第二次登陆有cookie
				long  lastVisitTime=Long.parseLong(cookie.getValue());
				//输出到界面
				response.getWriter().write("欢迎你登陆成功!"+username+"上次登陆时间为:"+new Date(lastVisitTime));
				//重置登陆时间
				cookie.setValue(System.currentTimeMillis()+"");
				response.addCookie(cookie);
			}
			
			
			
		}else {
			response.getWriter().write("登陆失败!");
		}
		
		
		
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设计思路:

  1. 判断账号是否正确
  2. 如果正确,则获取cookie。但是得到的cookie是一个数组,我们要从数组里面找到我们想要的对象。
  3. 如果找到的对象为空,表明是第一次登陆,那么添加cookie
  4. 如果找到的对象不为空,表明不是第一次登陆

## Cookie总结:

  1. cookie服务器给客户端发送过来的一小份数据,并且存放在客户端上的
  2. 获取cookie,添加cookie
request.getCookie();
response.addCookie();
  1. cookie分类

会话Cookie
默认情况下,关闭了浏览器,那么cookie就会消失
持久Cookie
在一定时间内,都有效,并且会保存在客户端上
cookie.setMaxAge(0);//设置立即删除 cookie.setMaxAge(100);//100秒

  1. Cookie的安全问题

由于cookie会保存在客户端上,所以会有安全隐患问题,cookie的大小和数量是有限制的:一个web服务器有20个cookie,总共有300个cookie,并且每个cookie的大小限定为4kb


Session介绍

介绍:Session(会话)Session是基于Cookie的一种会话机制
cookie和session的区别:
cookie是服务器返回一小份数据给客户端,并且存放在客服端上的,Session是,数据存放在服务器端的。
Session常用api

	HttpSession session=req.getSession();
		
		//得到会话ID
		String id=session.getId();
		
		//存值
		session.setAttribute(name, value);
		//取值
		session.getAttribute(name);
		//移除值
		session.removeAttribute(name);

例子 购物车设计:
需求:
在这里插入图片描述
根据需求:
结构如下
在这里插入图片描述
CarServlet.java

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;



public class CarServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
		resp.setContentType("text/html;charset=utf-8");
		//1.获取jsp里面商品的id
		int id=Integer.parseInt(req.getParameter("id"));
		String[] names= {"土豆","番茄","胡萝卜","白菜","洋芋"};
		String name=names[id];
		
		//2.获取购物车存放东西的session
		//把map对象存放在session里面去 并且只存放一次
		Map<String, Integer> map =(Map<String, Integer>) req.getSession().getAttribute("cart");
		if(map==null) {
			map= new LinkedHashMap<String,Integer>();
			req.getSession().setAttribute("cart", map);
		}
		//3.判断购物车里面有没有商品
		if (((HashMap<String, Integer>) map).containsKey(name)) {
			//在原来值的基础上+1
			map.put(name,map.get(name)+1);
		}else {
			//没有购买的商品数量为1
			map.put(name, 1);
		}
		resp.getWriter().write("<a href='product_list.jsp'><h3>继续购物</h3></a>");
		resp.getWriter().write("<a href='cart.jsp'><h3>去购物车结算</h3></a>");
		
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

cart.jsp

 <%@page import="java.util.Map" %>
 <%@page import="java.nio.channels.SeekableByteChannel" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
	//1.先获取到map
	Map<String,Integer> map=(Map<String,Integer> )session.getAttribute("cart");
	//2.遍历map
	if(map!=null){
		for(String key : map.keySet()){
			int value=map.get(key);
			%>
			<h3>名称:<%=key%> 数量:<%=value%></h3>
			<%
			
		}
	}

%>
</body>
</html>

product.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	<a href="CarServlet?id=0" ><h2>土豆</h2></a>
	<a href="CarServlet?id=1" ><h2>番茄</h2></a>
	<a href="CarServlet?id=2" ><h2>胡萝卜</h2></a>
	<a href="CarServlet?id=3" ><h2>白菜</h2></a>
	<a href="CarServlet?id=4" ><h2>洋芋</h2></a>


</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SessionDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>CarServlet</display-name>
    <servlet-name>CarServlet</servlet-name>
    <servlet-class>CarServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CarServlet</servlet-name>
    <url-pattern>/CarServlet</url-pattern>
  </servlet-mapping>
</web-app>

运行结果:
在这里插入图片描述
分别点击土豆两次 洋芋两次
结果正确:
在这里插入图片描述
继续Session清空购物车:
新建一个servlet 类:CleatCartServlet.java

CleatCartServlet.java

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CleatCartServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
		HttpSession session=req.getSession();
		
		/*
		 * 下面两种方法任选一个都能实现
		 * */
		//1.强制删除会话 里面的数据就没有了
		//session.invalidate();
		//2.从session中移除一个数据
		session.removeAttribute("cart");
		
		
		resp.sendRedirect("cart.jsp");
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

给cart.jsp加一个超链接

 <%@page import="java.util.Map" %>
 <%@page import="java.nio.channels.SeekableByteChannel" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
	//1.先获取到map
	Map<String,Integer> map=(Map<String,Integer> )session.getAttribute("cart");
	//2.遍历map
	if(map!=null){
		for(String key : map.keySet()){
			int value=map.get(key);
			%>
			<h3>名称:<%=key%> 数量:<%=value%></h3>
			<%
			
		}
	}

%>

	<a href="CleatCartServlet"><h5>清空购物车</h5></a>
</body>
</html>

结果:
在这里插入图片描述

点击清空购物车:
在这里插入图片描述

总结:
Cookie添加获取方法:

//给相应添加一个客户端
		resp.addCookie(cookie);
		resp.getWriter().write("请求成功");
		
		//获取客户端带过来的数据
		Cookie[] cookies=req.getCookies();

两种移除Session中的元素方法:

/*
		 * 下面两种方法任选一个都能实现
		 * */
		//1.强制删除会话 里面的数据就没有了
		//session.invalidate();
		//2.从session中移除一个数据
		session.removeAttribute("cart");

其他详情看列子…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值