IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Cookie -> 正文阅读

[网络协议]Cookie

什么是Cookie?

Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

HTTP 协议中的 Cookie 包括 Web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的一小块数据。服务器发送到浏览器的 Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器,例如用户保持登录状态。


Cookie 主要用于下面三个目的

  • 会话管理

登陆、购物车、游戏得分或者服务器应该记住的其他内容

  • 个性化

用户偏好、主题或者其他设置

  • 追踪

记录和分析用户行为


Cookie的几点说明

1.单个cookie大小不超过4kb

2.同一个域名下cookie的数量一般不超过20个(浏览器不同,会不同)

3.cookie用于存储少量不敏感的数据

4.cookie可以用来区分不同的客户端(在不登录时候,配合session


cookie的用法

Cookie的创建

?Cokie? cookie = new Cookie(“username”,”haoren”)

设置Cookie的存活时间(单位:秒)

cookie.setMaxAge(3600);

注意:正数:持久化(外存),负数:默认值(存在内存),零:删除cookie

设置Cookie的作用域

c.setPath("/");所有webapp都可以看到这个cookie

c.setPath("/Web1")只有Web1可以看到

写出Cookie:

response.addCookie(c);

读取Cookie

Cookie[] cookies = request.getCookies();

一次可以创建和发送多个cookie

Cookie存储中文的问题(在tomcat8之前Cookie中只能包含ASCII的编码,之后可以直接存储中文(但对特殊字符(例如:空格等)还是不支持,还是URL编码))

转码存储:

Cookie c =? new Cookie("name",URLEncoder.encode("好人", "utf-8") );

取出转码显示:

response.getWriter().print(URLDecoder.decode(ck[i].getValue(), "utf-8"));

同时别忘了设置页面的编码:response.setContentType("text/html;charset=utf-8");

不同的tomcat服务器间cookie共享问题

setDomain(String path)

ex: setDomain(“.sina.com.cn”),这时news.sina.com.cn和sports.sina.com.cn就都可以访问。


案例:记录客户上次登录的时间

package com.test.controller;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
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;

/**
 * 记录上次访问时间
 */
@WebServlet("/ServletDemo16")
public class ServletDemo16 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		Cookie[] cookies = request.getCookies();
		//当有time这个cookie时候设置为true
		boolean flag = false;
		if (cookies!=null&&cookies.length>0) {
			for (Cookie cookie : cookies) {
				if ("time".equals(cookie.getName())) {
					flag=true;
					//要处理编码的问题
					response.getWriter().print("上次访问时间:"+URLDecoder.decode(cookie.getValue(),"utf-8"));
					SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					Cookie ck = new Cookie("time", URLEncoder.encode(cookie.getValue(),"utf-8"));
					ck.setMaxAge(3600);
					ck.setPath("/ServletDemo");
					response.addCookie(ck);
					break;
				}
			}
			//如果cookies数组有值,但没有time这个值的时候创建
			if (flag==false) {
				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
				ck.setMaxAge(3600);
				ck.setPath("/ServletDemo");
				response.addCookie(ck);
			}
		}
		//cookies没有值,创建
		if(cookies==null||cookies.length==0){
			SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
			ck.setMaxAge(3600);
			ck.setPath("/ServletDemo");
			response.addCookie(ck);
		}
	}

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

}

案例:自动登陆

jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String username="";
	String password="";
	Cookie[] cookies = request.getCookies();
	if(cookies!=null&&cookies.length>0){
		for(Cookie c:cookies){
			if(c.getName().equals("username")){
				username=c.getValue();
			}
			if(c.getName().equals("password")){
				password=c.getValue();
			}
		}
	}
%>
	<form action="ServletDemo20" method="post">
		用户名:<input type="text" name="username" value="<%=username%>"><br>
		密码:<input type="password" name="password" value="<%=password %>"><br>
		<input type="submit" value="登陆">
		是否保存登录状态<input name="log" type="radio" value="yes">是
		<input name="log" type="radio" value="no">否
	</form>
</body>
</html>

java代码

package com.test.controller;

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 com.test.service.UserService;

/**
 * 自动登陆
 */
@WebServlet("/ServletDemo19")
public class ServletDemo19 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置编码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		boolean flag = false;
		//当cookie中有值就自动登陆
		Cookie[] cookies = request.getCookies();
		if(cookies!=null&&cookies.length>0){
			for (Cookie cookie : cookies) {
				if (new UserService().login(cookie.getName(),cookie.getValue())){
					flag=true;
					request.getRequestDispatcher("/WEB-INF/page/main.html").forward(request, response);
				}
			}
		}
		if (cookies==null||cookies.length==0||flag==false) {
			//获取从前台接收的数据
			String name = request.getParameter("username");
			String password = request.getParameter("password");
			System.out.println(name+";"+password);
			//判断是否登陆成功
			boolean login = new UserService().login(name, password);
			if(login){
				//登陆成功,给cookie传值
				Cookie cookie = new Cookie("username", name);
				Cookie cookie2 = new Cookie("password", password);
				//登陆成功,给session传值,跳转页面
				request.getSession().setAttribute("username",name);
				cookie.setMaxAge(60);
				cookie2.setMaxAge(60);
				cookie.setPath("/ServletDemo");
				cookie2.setPath("/ServletDemo");
				response.addCookie(cookie);
				response.addCookie(cookie2);
				request.getRequestDispatcher("/WEB-INF/page/main.html").forward(request, response);
			}else {
				response.getWriter().print("登陆失败!");
			}
		}
	}

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

}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:16:09  更:2021-10-19 12:17:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:26:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码