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

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

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

2、cookie在哪里?

3、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输入

http://localhost:8080/day01/cookie.jsp

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

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

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

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

如下是响应标头:

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

我们来看下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>

第一次访问

第二次访问

以上操作是我们需要重新关闭浏览器,在进行调试为什么呢?
因为默认情况下,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

自动登录

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>

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

显示最近的购物记录

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即可

以下是部分截图:

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创建-获取-持久化、自动登录、购物记录、作用路径,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java实现用户自动登录

    自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录. 自动登录是指用户将用户的登录信息,人,保存到本地的文件中Cookie中. Name,value -声明时 new Cookie(key,value); Path-默认值,即为当前保存cookie的这个serlvet所在的路径. 如果Cookie在这样的路径:http://loclhost:8080/project/abc/AServlet 则Cookie的路径为: http://loclhost/project/a

  • JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)

    其中包含两个jsp文件,分别为login.jsp和index.jsp 代码如下: login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

  • java使用Filter实现自动登录的方法

    本文实例为大家分享了java实现自动登录的具体代码,供大家参考,具体内容如下 当你勾选(记住登录状态),用cookie保存用户名和密码.不勾选,cookie失效. 所有的页面都要经过autoLoginFilter.java 的过滤器,在这类中,必须要判断cookies不为null,获得所有的cookie,得到name为user的cookie,进行用户名和密码的验证,如果不为null,则将user存入session. 在LoginServlet.java中,获得username和password参

  • 详解JavaEE使用过滤器实现登录(用户自动登录 安全登录 取消自动登录黑用户禁止登录)

    在我们生活中,对于账户的自动登录已经很常见了,所以利用过滤器实现这个功能. 主要介绍用户的自动登录和取消自动登录,以及实现一天自动登录或者n天实现自动登录,当用户ip被加入到黑名单之后,直接利用过滤器返回一个警告页面. 过滤器的功能很是强大,我们只需要在写好的前台后servlet之后进行添加就可以实现这个功能 Ps:这个仅仅只是一个演示而已,里面的访问数据库的部分,自己随意模拟了下,主要是突出实现自动登录的功能. 前台代码: 前台代码是成功与否都在这个页面显示.用到的技术:jstl标签的应用,s

  • java验证用户是否已经登录 java实现自动登录

    本文为大家分享了java验证用户是否已经登录与实现自动登录的详细代码,供大家参考,具体内容如下 1.验证用户是否已经登录 package cn.hongxin.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletExceptio

  • Java模拟新浪和腾讯自动登录并发送微博

    Java模拟新浪和腾讯自动登录并发送微博功能分享给大家,供大家参考,具体内容如下 1.准备工作 只是登录无需申请新浪和腾迅的开发者账号,如果需要发送微博功能,需要申请一个新浪和腾迅的开发者账号,并添加一个测试应用. 过程请参考官方帮助文档,申请地址:新浪:http://open.weibo.com    腾迅:http://dev.t.qq.com/ 我们需要的是App Key和App Secre及redirect_URI,源代码中已经包含了我申请的测试key,但由于限制直接用我的key你们的账

  • java 验证用户是否已经登录与实现自动登录方法详解

    验证用户是否已经登录 package cn.hongxin.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import jav

  • Java传入用户名和密码并自动提交表单实现登录到其他系统的实例代码

    不用单点登录,模拟远程项目的登录页面表单,在访问这个页面的时候自动提交表单到此项目的登录action,就可以实现登录到其他系统. ssh框架项目 1.以下是本地系统的action代码: import java.io.IOException; import java.util.List; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.i

  • java中使用Filter控制用户登录权限具体实例

    学jsp这么长时间,做的项目也有七八个了,可所有的项目都是用户登录就直接跳转到其拥有权限的页面,或者显示可访问页面的链接.使用这种方式来幼稚地控制访问权限.从来没有想过如果我没有登录,直接输入地址也可以直接访问用户的页面的. 在jsp中权限的控制是通过Filter过滤器来实现的,所有的开发框架中都集成有Filter,如果不适用开发框架则有如下实现方法: LoginFilter.java 复制代码 代码如下: public class LoginFilter implements Filter {

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

    1.cookie是啥?随手百度了网友的说说 简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机.当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你. 2.cookie在哪里? 3.cookie可以删除吗? 4.cookie实现原理 第一次请求浏览器,在浏览器的cookie存储区,没有co

  • jsp cookie+session实现简易自动登录

    本文实例为大家分享了jsp cookie+session实现简易自动登录的具体代码,供大家参考,具体内容如下 关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效. 如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间. login.jsp <%@ page language="java" contentType="text/html;

  • php版微信自动登录并获取昵称的方法

    本文实例讲述了php版微信自动登录并获取昵称的方法.分享给大家供大家参考,具体如下: 微信自动登录并获取昵称是可以通过api接口来获取的也是通过微信开放的接口来实现了,下面我们一起来看一个例子 仅记录:微信获取昵称自动登录 经过反复几次验证,发现我这个方法有缺陷: 微信内 未关注进入网站,无法获得昵称. 关注后用我这个方法可以获得昵称. 是否是因为第一次生成openid 所以还未生成昵称?待测试. /** * 获取当前页面完整URL地址 */ function get_url() { $sys_

  • Yii2框架实现登录、退出及自动登录功能的方法详解

    本文实例讲述了Yii2框架实现登录.退出及自动登录功能的方法.分享给大家供大家参考,具体如下: 自动登录的原理很简单.主要就是利用cookie来实现的 在第一次登录的时候,如果登录成功并且选中了下次自动登录,那么就会把用户的认证信息保存到cookie中,cookie的有效期为1年或者几个月. 在下次登录的时候先判断cookie中是否存储了用户的信息,如果有则用cookie中存储的用户信息来登录, 配置User组件 首先在配置文件的components中设置user组件 'user' => [ '

  • jsp实现用户自动登录功能

    理解并掌握Cookie的作用以及利用cookie实现用户的自动登录功能,实现下图效果 当服务器判断出该用户是首次登录的时候,会自动跳转到登录界面等待用户登录,并填入相关信息.通过设置Cookie的有效期限来保存用户的信息,关闭浏览器后,验证是否能够自动登录,若能登录,则打印欢迎信息:否则跳转到登录页面. login.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-

  • JavaWeb详细讲述Cookie和Session的概念

    目录 1.会话 2.保存会话的两种技术 3.Cookie 4.Session 1.会话 会话: 用户打开了一个浏览器,点击了很多超链接,访问多个web次元,关闭浏览器,这个过程可以称之为会话 有状态会话: 带有访问记录的会话 1.服务端会给客户端一个cookie,客户端下次访问时携带cookie访问就可以了 cookie 2.服务端登记客户端访问过,下次访问时匹配到客户端: session 2.保存会话的两种技术 cookie 客户端技术(响应,请求) session 服务器技术,利用这个技术,

  • 详解iOS App开发中Cookie的管理方法

    一.何为Cookie Cookie是网站为了便是终端身份,保存在终端本地的用户凭证信息.Cookie中的字段与意义由服务端进行定义.例如,当用户在某个网站进行了登录操作后,服务端会将Cookie信息返回给终端,终端会将这些信息进行保存,在下一次再次访问这个网站时,终端会将保存的Cookie信息一并发送到服务端,服务端根据Cookie信息是否有效来判断此用户是否可以自动登录. 二.iOS中进行Cookie管理的两个类 iOS中进行HTTP网络请求Cookie管理主要由两个类负责,一个类是NSHTT

  • 基于localStorge开发登录模块的记住密码与自动登录实例

    关于这个模块功能模块的由来,这是鸟大大的处女秀,为什么这么说呢?一天在群里,一个哥们说有私活,开发一个****模块,我那天手痒痒就和他聊了两句,然后,就决定给她做这个模块了,和他谈了谈交付时间,他说最迟两天,然后谈了谈加个,最后达成,500¥!!!这个模块其实第一天晚上我就开发出来了,那时我给他微信说,功能模块开发ok了,要不要远程查看一下,没问题的话就交了,一会他回我,好了就发过来,然后微信就转过来500¥,当时很诧异,毕竟是处女秀,然后就把项目交给他了,并且是完美交付,在客户那里,也没有出现

  • Android开发中Activity创建跳转及传值的方法

    在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider). 今天所介绍的就是Android开发中的四大组件之一:Activity,其他那三大组件以后再进行介绍.说道Android中的Activity,如果你做过iOS开发的话,Activity类似于iOS中的ViewController(视图控制器).在应用中能看到的东西都是放在活动中的.活动是安卓开发比较重要的东

随机推荐