欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

程序员文章站 2024-03-13 21:08:22
1、cookie是啥?随手百度了网友的说说 简单的说,cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,web服务器...

1、cookie是啥?随手百度了网友的说说

简单的说,cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,web服务器会先送一小小资料放在你的计算机上,当下次你再光临同一个网站,web服务器会先看看有没有它上次留下的cookie资料,有的话,就会依据cookie里的内容来判断使用者,送出特定的网页内容给你。

2、cookie在哪里?

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

3、cookie可以删除吗?

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

4、cookie实现原理

第一次请求浏览器,在浏览器的cookie存储区,没有cookie,

第一次访问不带cookie,浏览器通过http请求消息中增加cookie请求头将cookie回传给web服务器,浏览器会把cookie的信息片断以”名/值”对(name-value pairs)的形式储存保存在本地,下次访问,web服务器通过http响应消息中增加set-cookie响应头,将cookie信息发送给浏览器

我们通过实际来看下cookie吧

创建一个cookie.jsp,为了便于观察,设置session=”false”

<%@ page language="java" contenttype="text/html; charset=utf-8"
pageencoding="utf-8" session="false"%>
<!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>
<%
//创建一个cookie
cookie cookie = new cookie("name","wyf");
response.addcookie(cookie);
%>
</body>
</html>

我们第一次访问cookie.jsp文件,在ie输入


请求标头中,可以看到首次访问是不携带cookie的

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径 

在响应标头中,通过set-cookie传回,并且保存在浏览器本地cookie存储区

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

我们第二次访问cook.jsp文件,看看有没有变化

请求标头中,可以看到再次访问,是从浏览器本地cookie存储区,携带cookie的请求的

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径 

如下是响应标头:

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

我们用一个交互图,来了解下cookie机制:

我们来看下cookie的创建、获取

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

cookie.jsp中代码意思是:如果请求中,没有cookie,就创建并返回,请求中带cookie的话,就输出cookie键值对(name-value)

<%@ page language="java" contenttype="text/html; charset=utf-8"
pageencoding="utf-8" session="false"%>
<!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>
<%
cookie[] cookies = request.getcookies();
if(cookies !=null && cookies.length>0){
for(cookie cookie : cookies){
out.print(cookie.getname()+":"+cookie.getvalue());
}
}else{
out.print("没有cookie,正在创建,并且返回");
cookie cookie = new cookie("name","wyf");
response.addcookie(cookie);
}
%>
</body>
</html>

第一次访问

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径 

第二次访问

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

以上操作是我们需要重新关闭浏览器,在进行调试为什么呢?
因为默认情况下,cookie是一个会话级别的cookie,存储在浏览器的内核中,用户退出浏览器后被删除,若希望浏览器将该cookie存储在磁盘上,则需要使用maxage,单位为秒

我们来看下持久化cookie

<%
cookie[] cookies = request.getcookies();
if(cookies !=null && cookies.length>0){
for(cookie cookie : cookies){
out.print(cookie.getname()+":"+cookie.getvalue());
}
}else{
out.print("没有cookie,正在创建,并且返回");
cookie cookie = new cookie("name","wyf");
cookie.setmaxage(30);
response.addcookie(cookie);
}
%>

cookie.setmaxage(30);设置为30秒,这里就不截图了,说名下即可,第一次访问没有cookie创建cookie,第二次访问输出cookie键值对,关闭浏览器,在30秒内访问,依然提示cookie键值对,而不是之前的提示没有cookie创建cookie

自动登录

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

login.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>
<form action="success.jsp" method="post">
name:<input type="text" name="name"/>
<input type="submit" value="sumit"/>
</form>
</body>
</html>

success.jsp

<%@ page language="java" contenttype="text/html; charset=utf-8"
pageencoding="utf-8" session="false"%>
<!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>
<%
//若可以获取到参数name,则打印登录信息,将信息存储到cookie中,并设置cookei的时间
string name = request.getparameter("name");
if (name != null && !name.trim().equals("")) {
cookie cookie = new cookie("namecookie", name);
cookie.setmaxage(60);
response.addcookie(cookie);
} else {
//如果没有参数,可以用cookie登录,从cookie中读取用户信息,如果存在则打印欢迎信息
cookie[] cookies = request.getcookies();
if (cookies != null && cookies.length > 0) {
for (cookie cookie : cookies) {
string cookiename = cookie.getname();
if ("namecookie".equals(cookiename)) {
string val = cookie.getvalue();
name = val;
}
}
}
}
if (name != null && !name.trim().equals("")) {
out.print("hello" + name);
} else {
//若没有请求参数,也没有cookie,则重定向到login.jsp
response.sendredirect("login.jsp");
}
%>
</body>
</html>

第一次访问输入name参数值,提交,在success.jsp中,首先获取提交过来的参数name值,如果不为null,那么就直接设置一个cookie,保存参数name值,然后页面输出name参数值,第二次访问直接输入,
由于这次么有携带参数name值,我们只需要从cookie的value值中获取值,然后显示输出即可

显示最近的购物记录

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径 

books.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>
<h4>books page</h4>
<a href="book.jsp?book=javaweb">javaweb</a>
<a href="book.jsp?book=java">java</a>
<a href="book.jsp?book=oracle">oracle</a>
<a href="book.jsp?book=ajax">ajax</a>
<a href="book.jsp?book=javascript">javascript</a>
<a href="book.jsp?book=android">android</a>
<a href="book.jsp?book=jbpm">jbpm</a>
<br><br>
<%
//获取所有的cookie
cookie[] cookies = request.getcookies();
//从筛选出的book的cookie,如果cookiename为atguigu_book_ 开头的即符合条件
if(cookies!=null&&cookies.length>0){
for(cookie c:cookies){
string cookiename = c.getname();
if(cookiename.startswith("safly")){
//显示cookievalue
out.println(c.getvalue());
out.print("<br>");
}
}
}
%>
</body>
</html>

book.jsp

<%@page import="java.util.arraylist"%>
<%@ 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>
book:<%= request.getparameter("book") %>
<br><br>
<a href="books.jsp">return</a>
<%
string book = request.getparameter("book");
//确定要被删除的cookie
cookie[] cookies = request.getcookies();
//保存所有safly 开头的cookie
arraylist<cookie> bookcookies = new arraylist<cookie>();
//用来保存和books.jsp 传入的book匹配的那个cookie
cookie tempcookie = null;
if(cookies!=null&&cookies.length>0){
for(cookie c:cookies){
string cookiename = c.getname();
if(cookiename.startswith("safly")){
bookcookies.add(c);
//选购5个之后,在选5个中的一个
if(c.getvalue().equals(book)){
out.print("c.getvalue().equals(book)");
tempcookie = c;
}
}
}
}
//选购5个选除这5本以外的一本
if(bookcookies.size() >= 5&&tempcookie == null){
tempcookie = bookcookies.get(0); //
out.print("tempcookie == null");
}
//若在其中则删除bookcookie本身,将列表的重复cookie删掉,并且将其回传
if(tempcookie != null){
tempcookie.setmaxage(0);
response.addcookie(tempcookie);
}
//把从books.jsp传入的book作为一个cook返回
cookie cook = new cookie("safly"+book,book);
response.addcookie(cook);
%>
</body>
</html>

说一下逻辑关系:

在books.jsp中以下是书籍的列表,

javaweb
java
oracle
ajax
javascript
android
jbpm

我随便选择一个链接(比如javaweb),去跳转到book.jsp,第一次访问是没有带cookie的,所以会调用book.jsp如下的方法,创建了一个cookie,在book.jsp页面中,点击return返回到books.jsp就取出cooks.jsp带过来的cookievalue,然后展现选中的书籍列表即可

cookie cook = new cookie("safly"+book,book);
response.addcookie(cook);

此刻已经回到books.jsp中,已经选择了javaweb一本书,我们在选择一本(假如java),然后跳转到books.jsp,此刻我们会带着1个cookie(就是第一次选中javaweb访问books.jsp时候,给我传过来的),这个cookie的键值就是saflyjavaweb–javaweb,但是呢?选中第二本书java是没有带cookie的(没有saflyjava–java)
然后就进入到cooks.jsp中

if(cookiename.startswith("safly")){
bookcookies.add(c);}

所以也就将saflyjavaweb–javaweb放入到一bookcookies中(存放选中的书籍列表)然后呢,那个saflyjava–java就会创建,在点击renturn时候,反给cookies.jsp

。。。。第3、4、5次选择书时,是一样的过程
如果等books.jsp中选择了5本书时候,在选择这5本书中的某一本时候,怎么处理呢?
c.getvalue().equals(book)来获取选中的那本书,我们需要将此cookie删除然后,从新添加进来然后回传给cookies.jsp代码如下:

tempcookie.setmaxage(0);
response.addcookie(tempcookie);

如果等books.jsp中选择了5本书时候,在选择非此5本书的第6本书,怎么处理呢?
我们就tempcookie = bookcookies.get(0); 取出来那5本书的第一本,然后tempcookie.setmaxage(0);删除调第一本的cookie,然后将第6本书,创建cookie回传给cookies.jsp即可

以下是部分截图:

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

cookie的作用路径

cookie2.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 cookievalue = null;
cookie [] cookies = request.getcookies();
if(cookies!=null&& cookies.length>0){
for(cookie cookie:cookies){
if("cookiepath".equals(cookie.getname())){
cookievalue = cookie.getvalue();
}
}
}
if(cookievalue != null){
out.print(cookievalue);
}else{
out.print("没有指定的cookie");
}
%>
</body>
</html>

writercookie.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>
<%
//可以作用当前目录,和当前目录的子目录,但不能作用于当前目录的上一级目录
//可以通过setpath设置cookie的作用范围,/代表站点的根目录
cookie cookie = new cookie("cookiepath","cookiepathvalue");
cookie.setpath(request.getcontextpath());
response.addcookie(cookie);
%>
<a href="../cookie2.jsp">to cookie2.jsp</a>
</body>
</html>

to cookie2.jsp就是访问writercookie.jsp上级目录的cookie2.jsp

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

以上所述是小编给大家介绍的javaweb开发使用cookie创建-获取-持久化、自动登录、购物记录、作用路径,希望对大家有所帮助