詳細(xì)學(xué)習(xí)Java Cookie技術(shù)(用戶登錄、瀏覽、訪問權(quán)限)
本章文章詳細(xì)講解:
1、Cookie基本用法演示
2、演示Cookie的訪問權(quán)限
3、演示Cookie的刪除
4、利用Cookie顯示用戶上次登錄的時(shí)間
5、利用Cookie技術(shù)顯示用戶最近瀏覽的若干個(gè)圖片
6、測(cè)試火狐瀏覽器到底支持多少個(gè)Cookie和一個(gè)Cookie最大為多大
1、Cookie基本用法演示
index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <h1>演示Cookie技術(shù)</h1> <a href="CookieDemo">Cookie基本用法演示</a><br/> </body> </html>
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <servlet-name>CookieDemo</servlet-name> <servlet-class>cn.hncu.servlets.CookieDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo</servlet-name> <url-pattern>/CookieDemo</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
CookieDemo.java:
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Random;
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 CookieDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//向客戶端寫cookie
Random r = new Random();
int n =r.nextInt(100);
String name = "jack";//cookie的格式:key=value
Cookie c = new Cookie("name", name+n);
c.setMaxAge(60*60);//設(shè)置過期時(shí)間,以秒為單位
c.setPath( request.getContextPath() );//該路徑是: /項(xiàng)目名
//Cookie機(jī)制中,是通過path來(lái)控制權(quán)限的。只有<url-pattern>和該path相同或是它的子路徑的servlet才能夠訪問該cookie
//如果把一個(gè)cookie的path設(shè)為項(xiàng)目根目錄,那么該項(xiàng)目下的所有servlet都能夠訪問它
response.addCookie(c);
//這一段演示cookie帶中文
String str = "我?guī)е形?;
str = URLEncoder.encode(str, "utf-8");//中文設(shè)置編碼?。?!urlencode編碼
Cookie cStr = new Cookie("str", str);
//如果不設(shè)置setMaxAge,則瀏覽器一關(guān)閉就過期
cStr.setPath("/");
response.addCookie(cStr);
//讀取客戶端發(fā)過來(lái)的cookie
Cookie cs[] = request.getCookies();//讀取cookie
if(cs!=null){//防范一下
for(Cookie cc:cs){
String name2 = cc.getName();
String val = cc.getValue();
val = URLDecoder.decode(val, "utf-8");//原來(lái)是怎么編碼的,就怎么解碼! 中文解碼,ascii是原樣的!
out.print(name2+"="+val+"<br/>");
}
}
out.print("Cook保存成功!");
}
}
演示結(jié)果:

第一次點(diǎn)擊時(shí)!session下次講!tomcat自動(dòng)生成發(fā)給客戶端的!

再次進(jìn)入時(shí)!
name+n–因?yàn)楹竺娴膎一直在隨機(jī)生成,這個(gè)點(diǎn)擊總是顯示的是前一個(gè)的信息!


2、演示Cookie的訪問權(quán)限
index.jsp:
<a href="servlet/CookieDemo2">演示Cookie的訪問權(quán)限</a><br/> web.xml: <servlet> <servlet-name>CookieDemo2</servlet-name> <servlet-class>cn.hncu.servlets.CookieDemo2</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo2</servlet-name> <url-pattern>/servlet/CookieDemo2</url-pattern> </servlet-mapping>
CookieDemo2.java:
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
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 CookieDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//向客戶端寫Cookie
Random r = new Random();
int n =r.nextInt(100);
Cookie c = new Cookie("age", ""+n);
c.setMaxAge(60*60);//過期時(shí)間
c.setPath( request.getContextPath()+"/servlet/CookieDemo2" );//Cookie機(jī)制中,是通過path來(lái)控制權(quán)限的
//由于CookieDemo的url-pattern是項(xiàng)目根目錄/CookieDemo,不是當(dāng)前cookie所設(shè)路徑的子目錄,因此無(wú)法訪問到該cookie
//注意?。?!path不一樣,那么cookie是不同的對(duì)象,也就是不會(huì)覆那個(gè)名字相同的cookie!
response.addCookie(c);
//讀取從客戶端發(fā)來(lái)的cookie
Cookie cs[] = request.getCookies();
if(cs!=null){
for(Cookie cc:cs){
String name = cc.getName();
String val = cc.getValue();
out.print("22222--"+name+"="+val+"<br/>");
}
}
out.print("Cookie保存成功!");
}
}
演示結(jié)果:
先進(jìn)入CookieDemo2的頁(yè)面,能訪問到CookieDemo的name-cookie

再進(jìn)入CookieDemo的頁(yè)面,不能訪問到CookieDemo2的age-cookie

3、演示Cookie的刪除
index.jsp:
<a href="servlet/DelCookieDemo"> 演示Cookie的刪除 </a><br/>
web.xml:
<servlet> <servlet-name>DelCookieDemo</servlet-name> <servlet-class>cn.hncu.servlets.DelCookieDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>DelCookieDemo</servlet-name> <url-pattern>/servlet/DelCookieDemo</url-pattern> </servlet-mapping>
DelCookieDemo.java:
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
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 DelCookieDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie cs[] = request.getCookies();
if(cs!=null){
for(Cookie c:cs){
//要想遍歷到"name"這個(gè)cookie,當(dāng)前servlet必須要有讀的權(quán)限,即servlet的url-pattern必須是該cookie所設(shè)路徑或者是其所設(shè)路徑的子路徑
//刪除name這個(gè)cookie
if("name".equals(c.getName())){
c.setPath( request.getContextPath() );//刪除時(shí)是通過這一句來(lái)判斷權(quán)限的!這里必須和原來(lái)所設(shè)的路徑完全一樣才能刪除,否則不能刪除!
//對(duì)于上句,我的個(gè)人理解是:因?yàn)槿绻氵@個(gè)路徑設(shè)置不同了,其實(shí)只是相當(dāng)與新開了一個(gè)cookie,這個(gè)新cookie的到期時(shí)間是0,name是"name"
c.setMaxAge(0);//到期時(shí)見設(shè)為0,即是刪除---此處只是設(shè)置刪除標(biāo)識(shí)
response.addCookie(c);
}
}
}
}
}
演示結(jié)果:
這個(gè)時(shí)候,name還存在的。

我們?cè)L問DelCookieDemo.

再去第一個(gè)鏈接看:

name已經(jīng)沒有了!
火狐會(huì)自動(dòng)刪除過期的cookie:

4、利用Cookie顯示用戶上次登錄的時(shí)間
index.jsp:
<a href="LoginServlet">利用Cookie顯示用戶上次登錄的時(shí)間</a>
web.xml:
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>cn.hncu.servlets.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping>
LoginServlet.java:
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
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;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>演示利用Cookie顯示用戶上次登錄的時(shí)間</TITLE></HEAD>");
out.println(" <BODY>");
//讀取客戶端的cookie
Cookie cs[] = request.getCookies();
boolean boo = false;
if(cs!=null){
for(Cookie c:cs){
//遍歷
if("loginTime".equals(c.getName())){
String val =c.getValue();
long dt = Long.parseLong(val);
Date d = new Date(dt);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
out.print("您上次登錄時(shí)間是:"+sdf.format(d));
boo=true;
break;
}
}
}
if(boo==false){//表示之前1年沒有訪問記錄!因?yàn)橄旅嫖覀儽4娴倪^期時(shí)間是一年
out.print("您最近一年是第一次訪問。。。");
}
//無(wú)論是新舊用戶,都會(huì)以最近的時(shí)間倆創(chuàng)建一個(gè)Cookie,寫到客戶端。原來(lái)有了的,就是更新時(shí)間
Date d = new Date();
Cookie c = new Cookie("loginTime", ""+d.getTime() );
c.setPath(request.getContextPath());
c.setMaxAge(60*60*24*30*12);
response.addCookie(c);
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
演示結(jié)果:
第一次訪問;

再次訪問:

5、利用Cookie技術(shù)顯示用戶最近瀏覽的若干個(gè)圖片
index.jsp:
<a href="jsps/show.jsp">看美女--利用Cookie技術(shù)顯示用戶最近瀏覽的若干個(gè)圖片</a>
web.xml:
<servlet> <servlet-name>ShowServlet</servlet-name> <servlet-class>cn.hncu.servlets.ShowServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ShowServlet</servlet-name> <url-pattern>/showImg</url-pattern> </servlet-mapping>
show.jsp:
<%@page import="java.io.File"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<style type="text/css">
.span{
border:0px solid #000;
width:100px;
height:100px;
overflow:hidden;
}
.span img{
max-width:100px;
_width:expression(this.width > 100 ? "100px" : this.width);
}
.spans{
border:0px solid #000;
width:50px;
height:50px;
overflow:hidden;
}
.spans img{
max-width:50px;
_width:expression(this.width > 50 ? "50px" : this.width);
}
</style>
</head>
<body>
<h1>看美女--利用Cookie技術(shù)顯示用戶最近瀏覽的若干個(gè)圖片</h1>
<a href="/myCookieWeb/jsps/show.jsp">看美女--利用Cookie技術(shù)顯示用戶最近瀏覽的若干個(gè)圖片</a>
<h3>最近瀏覽的圖片:</h3>
<!-- 添加最近3次瀏覽的圖片 -->
<%
String str =null;
Cookie cs[] = request.getCookies();
if(cs!=null){
for(Cookie c:cs){
if("images".equals(c.getName())){
str=c.getValue();// ***.jpg
break;
}
}
}
if(str!=null){
String strs[] = str.split(",");
for(String s:strs){
%>
<span class="spans">
<img src="<%=request.getContextPath()%>/imgs/<%=s%>" />
</span>
<%
}
}
%>
<br/><hr/><br/>
<%
//利用file遍歷所有的圖片,顯示出來(lái)。
String path = getServletContext().getRealPath("/imgs");
//System.out.printf(path);//D:\apache-tomcat-7.0.30\webapps\myCookieWeb\jsps
File file = new java.io.File(path);
File[] files = file.listFiles();
if(files!=null){
%>
<%
for(File f:files){
String imgName = f.getName();
%>
<span class="span">
<a href="<%=request.getContextPath() %>/showImg?img=<%=imgName %>">
<img src="<%=request.getContextPath()%>/imgs/<%=imgName%>" />
</a>
</span>
<%
}
%>
<%
}
%>
</body>
</html>
ShowServlet.java:
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
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 ShowServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
String img = request.getParameter("img");
String imgStr = "<img src='"+request.getContextPath()+"/imgs/"+img+"'/>";
out.print(imgStr);
//用Cookie記錄用戶訪問過的圖片信息
Cookie cs[] = request.getCookies();
boolean boo = false;
if(cs!=null){
for(Cookie c:cs){
if("images".equals(c.getName())){//已經(jīng)有了images這個(gè)cookie
String imgs = c.getValue();
String imgStrs[] = imgs.split(",");
boolean booStr = false;
//防范點(diǎn)擊重復(fù)的圖片
for(int i=0;i<imgStrs.length;i++){
if(imgStrs[i].equals(img)){
if(i==1&&imgStrs.length==2){
imgs=imgStrs[i]+","+imgStrs[0];
}else if(i==2&&imgStrs.length==3){
imgs=imgStrs[i]+","+imgStrs[0]+","+imgStrs[1];
}else if(i==2&&imgStrs.length==3){
imgs=imgStrs[i]+","+imgStrs[0]+","+imgStrs[1];
}
booStr=true;
break;
}
}
if(!booStr){
imgs = img+","+imgs;//采用如下方式會(huì)麻煩一點(diǎn):imgs+","+img
if(imgs.split(",").length>3){//如果訪問的圖片超過3次了
imgs = imgs.substring(0, imgs.lastIndexOf(","));//左包含,右不包含
}
/*//如果這樣寫了,最好把上面的防范重復(fù)的圖片,那個(gè)添加順序倒過來(lái)
//imgs+","+img 方式:
imgs = imgs+","+img;
if(imgs.split(",").length>3){//如果訪問的圖片超過3次了
imgs = imgs.substring(imgs.indexOf(",")+1, imgs.length());
}
*/
}
c.setValue(imgs);//更新
c.setMaxAge(60*60*24*30);
c.setPath("/");//相當(dāng)于把訪問權(quán)限完全放開,即所有的項(xiàng)目都能訪問
response.addCookie(c);
boo=true;
break;
}
}
}
if(boo==false){//表示首次訪問,即瀏覽器中沒有圖片瀏覽的cookie
Cookie c = new Cookie("images", img);
c.setMaxAge(60*60*24*30);
c.setPath("/");
response.addCookie(c);
}
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
演示結(jié)果:

6、測(cè)試火狐瀏覽器到底支持多少個(gè)Cookie和一個(gè)Cookie最大為多大
index.jsp:
<a href="servlet/HowManyCookieServlet">測(cè)試火狐瀏覽器到底支持多少個(gè)Cookie和一個(gè)Cookie最大為多大 </a><br/>
web.xml:
<servlet> <servlet-name>HowManyCookie</servlet-name> <servlet-class>cn.hncu.servlets.HowManyCookie</servlet-class> </servlet> <servlet-mapping> <servlet-name>HowManyCookie</servlet-name> <url-pattern>/servlet/HowManyCookieServlet</url-pattern> </servlet-mapping>
HowManyCookie.java:
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
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 HowManyCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
/*
//測(cè)試個(gè)數(shù)--火狐47.0.1 最大支持110個(gè)
for(int i=1;i<=110;i++){
Cookie c = new Cookie("textNum"+i, ""+i);
c.setMaxAge(60*15);
c.setPath("/");
response.addCookie(c);
}
*/
//測(cè)試大小 ---4092字節(jié)為最大支持的單個(gè)cookie存儲(chǔ)
String s ="";
for(int i=0;i<4092;i++){
s+="1";
}
Cookie c = new Cookie("test", s);
c.setMaxAge(60*15);
c.setPath("/");
response.addCookie(c);
Cookie cs[] = request.getCookies();//讀取cookie
if(cs!=null){//防范一下
for(Cookie cc:cs){
String key = cc.getName();
String val = cc.getValue();
out.print(key+"="+val+" ");
}
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java基于websocket協(xié)議與netty實(shí)時(shí)視頻彈幕交互實(shí)現(xiàn)
本文主要介紹了Java基于websocket協(xié)議與netty實(shí)時(shí)視頻彈幕交互實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
MyBatis動(dòng)態(tài)SQL foreach標(biāo)簽實(shí)現(xiàn)批量插入的方法示例
這篇文章主要介紹了MyBatis動(dòng)態(tài)SQL foreach標(biāo)簽實(shí)現(xiàn)批量插入的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
解決idea打包成功但是resource下的文件沒有成功的問題
這篇文章主要介紹了解決idea打包成功但是resource下的文件沒有成功的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-08-08
Jenkins自動(dòng)化部署springboot代碼實(shí)例
這篇文章主要介紹了Jenkins自動(dòng)化部署springboot代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
springboot 加載 META-INF/spring.factories方式
這篇文章主要介紹了springboot 加載 META-INF/spring.factories方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
詳解eclipse項(xiàng)目中.classpath文件的使用
這篇文章主要介紹了詳解eclipse項(xiàng)目中.classpath文件的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解
在Java微服務(wù)越來(lái)越火的今天。幾乎什么公司都在搞微服務(wù)。而使用的比較多的就是Spring?Cloud技術(shù)棧。今天就來(lái)研究一下Spring?Cloud中服務(wù)發(fā)現(xiàn)與調(diào)用的基本原理2022-07-07
JAVA WSIMPORT生成WEBSERVICE客戶端401認(rèn)證過程圖解
這篇文章主要介紹了JAVA WSIMPORT生成WEBSERVICE客戶端401認(rèn)證過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

