基于SpringMVC的Cookie常用操作详解



在下面的内容中,我将介绍基于SpringMVC的一些Cookie常用操作,包括:cookie的增、删、改、查

一 Cookie的属性简介

对于一个Cookie来说,一般有以下几个属性:

wKioL1g7jNqAPi17AABx-VgU5Gg747.png

Name:一个cookie的名字

Value:一个cookie的值

Domain:可以访问该cookie的域名。非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成;顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成;二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了;顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取

Path:可以访问此cookie的页面路径

Expires/Max-Age:该cookie的超时时间。若设置为一个具体的时间,那么当到达此时间后,此cookie失效;不设置的话默认值是Session,当前会话结束后该cookie失效(PS:比如关闭浏览器

Size:该cookie的大小

HTTP:cookie的httponly属性。若此属性为true,那么在客户端则不能通过脚本(PS:比如JavaScript)来读取该cookie值

Secure:若此属性为true,cookie 只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该cookie

注:该视图可以在浏览器中按F12,在Resources栏目中看到

二 关于Cookie的一个简单入门示例

(1)在一个Controller中手动设置cookie的一些参数:

	@RequestMapping("/hello.html")
	publicModelAndViewhello(@CookieValue(name="hitCounter",defaultValue="0")LonghitCounter,HttpServletResponseresponse){
		ModelAndViewmAndView=newModelAndView("hello");
		
		hitCounter++;
		
		Cookiehit=newCookie("hitCounter",hitCounter.toString());
		
		hit.setHttpOnly(true);//如果设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法访问该Cookie
		hit.setMaxAge(60*60);//设置生存期为1小时
//		hit.setDomain("www.zifansky.cn");//子域,在这个子域下才可以访问该Cookie
//		hit.setPath("/hello");//在这个路径下面的页面才可以访问该Cookie
//		hit.setSecure(true);//如果设置了Secure,则只有当使用https协议连接时cookie才可以被页面访问
		
		response.addCookie(hit);
		
		returnmAndView;
	}

在这里,通过手动创建了一个cookie,并设置了一系列的参数,最后通过HttpServletResponse传递到返回页中

(2)hello.jsp页面:

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
	pageEncoding="UTF-8"%>

SpringMVCCookieDemo

Pagehitcounter: ${cookie.hitCounter.value}

最后的显示效果如下:

wKiom1g7jRyj6LplAACLJuB9hUg651.png

然后每次刷新页面,页面中的数字都会增加

三Cookie的增删改查示例

(1)新建一个CookieUtils类,用于写cookie的基本增删改查:

packagecn.zifangsky.utils;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServletRequest;

publicclassCookieUtils{

	

	/**
	*添加一个新Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookie
	*新cookie
	*
	*@returnnull
	*/
	publicstaticvoidaddCookie(HttpServletResponseresponse,Cookiecookie){
		if(cookie!=null)
			response.addCookie(cookie);
	}

	/**
	*添加一个新Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*cookie名称
	*@paramcookieValue
	*cookie值
	*@paramdomain
	*cookie所属的子域
	*@paramhttpOnly
	*是否将cookie设置成HttpOnly
	*@parammaxAge
	*设置cookie的最大生存期
	*@parampath
	*设置cookie路径
	*@paramsecure
	*是否只允许HTTPS访问
	*
	*@returnnull
	*/
	publicstaticvoidaddCookie(HttpServletResponseresponse,StringcookieName,StringcookieValue,Stringdomain,
			booleanhttpOnly,intmaxAge,Stringpath,booleansecure){
		if(cookieName!=null&&!cookieName.equals("")){
			if(cookieValue==null)
				cookieValue="";

			CookienewCookie=newCookie(cookieName,cookieValue);
			if(domain!=null)
				newCookie.setDomain(domain);

			newCookie.setHttpOnly(httpOnly);

			if(maxAge>0)
				newCookie.setMaxAge(maxAge);

			if(path==null)
				newCookie.setPath("/");
			else
				newCookie.setPath(path);

			newCookie.setSecure(secure);

			addCookie(response,newCookie);
		}
	}

	/**
	*添加一个新Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*cookie名称
	*@paramcookieValue
	*cookie值
	*@paramdomain
	*cookie所属的子域
	*
	*@returnnull
	*/
	publicstaticvoidaddCookie(HttpServletResponseresponse,StringcookieName,StringcookieValue,Stringdomain){
		addCookie(response,cookieName,cookieValue,domain,true,CookieConstantTable.COOKIE_MAX_AGE,"/",false);
	}

	/**
	*根据Cookie名获取对应的Cookie
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramcookieName
	*cookie名称
	*
	*@return对应cookie,如果不存在则返回null
	*/
	publicstaticCookiegetCookie(HttpServletRequestrequest,StringcookieName){
		Cookie[]cookies=request.getCookies();

		if(cookies==null||cookieName==null||cookieName.equals(""))
			returnnull;

		for(Cookiec:cookies){
			if(c.getName().equals(cookieName))
				return(Cookie)c;
		}
		returnnull;
	}

	/**
	*根据Cookie名获取对应的Cookie值
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramcookieName
	*cookie名称
	*
	*@return对应cookie值,如果不存在则返回null
	*/
	publicstaticStringgetCookieValue(HttpServletRequestrequest,StringcookieName){
		Cookiecookie=getCookie(request,cookieName);
		if(cookie==null)
			returnnull;
		else
			returncookie.getValue();
	}

	/**
	*删除指定Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookie
	*待删除cookie
	*/
	publicstaticvoiddelCookie(HttpServletResponseresponse,Cookiecookie){
		if(cookie!=null){
			cookie.setPath("/");
			cookie.setMaxAge(0);
			cookie.setValue(null);

			response.addCookie(cookie);
		}
	}

	/**
	*根据cookie名删除指定的cookie
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*待删除cookie名
	*/
	publicstaticvoiddelCookie(HttpServletRequestrequest,HttpServletResponseresponse,StringcookieName){
		Cookiec=getCookie(request,cookieName);
		if(c!=null&&c.getName().equals(cookieName)){
			delCookie(response,c);
		}
	}

	/**
	*根据cookie名修改指定的cookie
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*cookie名
	*@paramcookieValue
	*修改之后的cookie值
	*@paramdomain
	*修改之后的domain值
	*/
	publicstaticvoideditCookie(HttpServletRequestrequest,HttpServletResponseresponse,StringcookieName,
			StringcookieValue,Stringdomain){
		Cookiec=getCookie(request,cookieName);
		if(c!=null&&cookieName!=null&&!cookieName.equals("")&&c.getName().equals(cookieName)){
			addCookie(response,cookieName,cookieValue,domain);
		}
	}
}

注:上面用到的CookieConstantTable类,其内容如下:

packagecn.zifangsky.utils;

publicclassCookieConstantTable{
	//cookie的有效期默认为30天
	publicfinalstaticintCOOKIE_MAX_AGE=60*60*24*30;
	//cookie加密时的额外的salt
	publicfinalstaticStringsalt="www.zifangsky.cn";
	//自动登录的Cookie名
	publicfinalstaticStringRememberMe="remember-me";
}

(2)在上面的controller中新添加几个方法:

	@RequestMapping("/testAddCookie.html")
	publicModelAndViewaddCookie(HttpServletResponseresponse){
		ModelAndViewmAndView=newModelAndView("show");

//		CookieUtils.addCookie(response,"test_addCookie",UUID.randomUUID().toString(),null);
		CookieUtils.addCookie(response,"test_2",UUID.randomUUID().toString()+newRandom(1000).nextInt(),"localhost");
		
		returnmAndView;
	}
	
	@RequestMapping("/testGetCookie.html")
	publicvoidgetCookie(HttpServletRequestrequest){
		System.out.println(CookieUtils.getCookieValue(request,"test_2"));
	}
	
	@RequestMapping("/testEditCookie.html")
	publicModelAndVieweditCookie(HttpServletRequestrequest,HttpServletResponseresponse){
		ModelAndViewmAndView=newModelAndView("show");
		
		CookieUtils.editCookie(request,response,"test_2","editeditedit","localhost");
		
		returnmAndView;
	}
	
	@RequestMapping("/testDelCookie.html")
	publicvoiddelCookie(HttpServletRequestrequest,HttpServletResponseresponse){
		CookieUtils.delCookie(request,response,"test_2");
	}
}

(3)显示cookie的show.jsp页面:

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
">

SpringMVCCookieDemo

TheCookieis: ${cookie.test_2.value}

 

(4)效果测试:

i)新建cookie:

访问:http://localhost:9180/CookieDemo/testAddCookie.html

wKioL1g7jX_Qde8qAACmlK65Yuc424.png

ii)获取cookie:

访问:http://localhost:9180/CookieDemo/testGetCookie.html

输出如下:

14583736-4f5e-4411-9785-f19e9190a0b4-1244746321

iii)修改cookie:

访问:http://localhost:9180/CookieDemo/testEditCookie.html

wKioL1g7jarCRuwPAACbv4y_xY0233.png

iv)删除cookie:

访问:http://localhost:9180/CookieDemo/testDelCookie.html

wKiom1g7jcyBK37sAABzYgxyoyg470.png

在下面的内容中,我将介绍基于SpringMVC的一些Cookie常用操作,包括:cookie的增、删、改、查

一 Cookie的属性简介

对于一个Cookie来说,一般有以下几个属性:

wKioL1g7jNqAPi17AABx-VgU5Gg747.png

Name:一个cookie的名字

Value:一个cookie的值

Domain:可以访问该cookie的域名。非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成;顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成;二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了;顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取

Path:可以访问此cookie的页面路径

Expires/Max-Age:该cookie的超时时间。若设置为一个具体的时间,那么当到达此时间后,此cookie失效;不设置的话默认值是Session,当前会话结束后该cookie失效(PS:比如关闭浏览器

Size:该cookie的大小

HTTP:cookie的httponly属性。若此属性为true,那么在客户端则不能通过脚本(PS:比如JavaScript)来读取该cookie值

Secure:若此属性为true,cookie 只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该cookie

注:该视图可以在浏览器中按F12,在Resources栏目中看到

二 关于Cookie的一个简单入门示例

(1)在一个Controller中手动设置cookie的一些参数:

	@RequestMapping("/hello.html")
	publicModelAndViewhello(@CookieValue(name="hitCounter",defaultValue="0")LonghitCounter,HttpServletResponseresponse){
		ModelAndViewmAndView=newModelAndView("hello");
		
		hitCounter++;
		
		Cookiehit=newCookie("hitCounter",hitCounter.toString());
		
		hit.setHttpOnly(true);//如果设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法访问该Cookie
		hit.setMaxAge(60*60);//设置生存期为1小时
//		hit.setDomain("www.zifansky.cn");//子域,在这个子域下才可以访问该Cookie
//		hit.setPath("/hello");//在这个路径下面的页面才可以访问该Cookie
//		hit.setSecure(true);//如果设置了Secure,则只有当使用https协议连接时cookie才可以被页面访问
		
		response.addCookie(hit);
		
		returnmAndView;
	}

在这里,通过手动创建了一个cookie,并设置了一系列的参数,最后通过HttpServletResponse传递到返回页中

(2)hello.jsp页面:

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
	pageEncoding="UTF-8"%>

SpringMVCCookieDemo

Pagehitcounter: ${cookie.hitCounter.value}

最后的显示效果如下:

wKiom1g7jRyj6LplAACLJuB9hUg651.png

然后每次刷新页面,页面中的数字都会增加

三Cookie的增删改查示例

(1)新建一个CookieUtils类,用于写cookie的基本增删改查:

packagecn.zifangsky.utils;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServletRequest;

publicclassCookieUtils{

	

	/**
	*添加一个新Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookie
	*新cookie
	*
	*@returnnull
	*/
	publicstaticvoidaddCookie(HttpServletResponseresponse,Cookiecookie){
		if(cookie!=null)
			response.addCookie(cookie);
	}

	/**
	*添加一个新Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*cookie名称
	*@paramcookieValue
	*cookie值
	*@paramdomain
	*cookie所属的子域
	*@paramhttpOnly
	*是否将cookie设置成HttpOnly
	*@parammaxAge
	*设置cookie的最大生存期
	*@parampath
	*设置cookie路径
	*@paramsecure
	*是否只允许HTTPS访问
	*
	*@returnnull
	*/
	publicstaticvoidaddCookie(HttpServletResponseresponse,StringcookieName,StringcookieValue,Stringdomain,
			booleanhttpOnly,intmaxAge,Stringpath,booleansecure){
		if(cookieName!=null&&!cookieName.equals("")){
			if(cookieValue==null)
				cookieValue="";

			CookienewCookie=newCookie(cookieName,cookieValue);
			if(domain!=null)
				newCookie.setDomain(domain);

			newCookie.setHttpOnly(httpOnly);

			if(maxAge>0)
				newCookie.setMaxAge(maxAge);

			if(path==null)
				newCookie.setPath("/");
			else
				newCookie.setPath(path);

			newCookie.setSecure(secure);

			addCookie(response,newCookie);
		}
	}

	/**
	*添加一个新Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*cookie名称
	*@paramcookieValue
	*cookie值
	*@paramdomain
	*cookie所属的子域
	*
	*@returnnull
	*/
	publicstaticvoidaddCookie(HttpServletResponseresponse,StringcookieName,StringcookieValue,Stringdomain){
		addCookie(response,cookieName,cookieValue,domain,true,CookieConstantTable.COOKIE_MAX_AGE,"/",false);
	}

	/**
	*根据Cookie名获取对应的Cookie
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramcookieName
	*cookie名称
	*
	*@return对应cookie,如果不存在则返回null
	*/
	publicstaticCookiegetCookie(HttpServletRequestrequest,StringcookieName){
		Cookie[]cookies=request.getCookies();

		if(cookies==null||cookieName==null||cookieName.equals(""))
			returnnull;

		for(Cookiec:cookies){
			if(c.getName().equals(cookieName))
				return(Cookie)c;
		}
		returnnull;
	}

	/**
	*根据Cookie名获取对应的Cookie值
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramcookieName
	*cookie名称
	*
	*@return对应cookie值,如果不存在则返回null
	*/
	publicstaticStringgetCookieValue(HttpServletRequestrequest,StringcookieName){
		Cookiecookie=getCookie(request,cookieName);
		if(cookie==null)
			returnnull;
		else
			returncookie.getValue();
	}

	/**
	*删除指定Cookie
	*
	*@authorzifangsky
	*@paramresponse
	*HttpServletResponse
	*@paramcookie
	*待删除cookie
	*/
	publicstaticvoiddelCookie(HttpServletResponseresponse,Cookiecookie){
		if(cookie!=null){
			cookie.setPath("/");
			cookie.setMaxAge(0);
			cookie.setValue(null);

			response.addCookie(cookie);
		}
	}

	/**
	*根据cookie名删除指定的cookie
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*待删除cookie名
	*/
	publicstaticvoiddelCookie(HttpServletRequestrequest,HttpServletResponseresponse,StringcookieName){
		Cookiec=getCookie(request,cookieName);
		if(c!=null&&c.getName().equals(cookieName)){
			delCookie(response,c);
		}
	}

	/**
	*根据cookie名修改指定的cookie
	*
	*@authorzifangsky
	*@paramrequest
	*HttpServletRequest
	*@paramresponse
	*HttpServletResponse
	*@paramcookieName
	*cookie名
	*@paramcookieValue
	*修改之后的cookie值
	*@paramdomain
	*修改之后的domain值
	*/
	publicstaticvoideditCookie(HttpServletRequestrequest,HttpServletResponseresponse,StringcookieName,
			StringcookieValue,Stringdomain){
		Cookiec=getCookie(request,cookieName);
		if(c!=null&&cookieName!=null&&!cookieName.equals("")&&c.getName().equals(cookieName)){
			addCookie(response,cookieName,cookieValue,domain);
		}
	}
}

注:上面用到的CookieConstantTable类,其内容如下:

packagecn.zifangsky.utils;

publicclassCookieConstantTable{
	//cookie的有效期默认为30天
	publicfinalstaticintCOOKIE_MAX_AGE=60*60*24*30;
	//cookie加密时的额外的salt
	publicfinalstaticStringsalt="www.zifangsky.cn";
	//自动登录的Cookie名
	publicfinalstaticStringRememberMe="remember-me";
}

(2)在上面的controller中新添加几个方法:

	@RequestMapping("/testAddCookie.html")
	publicModelAndViewaddCookie(HttpServletResponseresponse){
		ModelAndViewmAndView=newModelAndView("show");

//		CookieUtils.addCookie(response,"test_addCookie",UUID.randomUUID().toString(),null);
		CookieUtils.addCookie(response,"test_2",UUID.randomUUID().toString()+newRandom(1000).nextInt(),"localhost");
		
		returnmAndView;
	}
	
	@RequestMapping("/testGetCookie.html")
	publicvoidgetCookie(HttpServletRequestrequest){
		System.out.println(CookieUtils.getCookieValue(request,"test_2"));
	}
	
	@RequestMapping("/testEditCookie.html")
	publicModelAndVieweditCookie(HttpServletRequestrequest,HttpServletResponseresponse){
		ModelAndViewmAndView=newModelAndView("show");
		
		CookieUtils.editCookie(request,response,"test_2","editeditedit","localhost");
		
		returnmAndView;
	}
	
	@RequestMapping("/testDelCookie.html")
	publicvoiddelCookie(HttpServletRequestrequest,HttpServletResponseresponse){
		CookieUtils.delCookie(request,response,"test_2");
	}
}

(3)显示cookie的show.jsp页面:

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
">

SpringMVCCookieDemo

TheCookieis: ${cookie.test_2.value}

 

(4)效果测试:

i)新建cookie:

访问:http://localhost:9180/CookieDemo/testAddCookie.html

wKioL1g7jX_Qde8qAACmlK65Yuc424.png

ii)获取cookie:

访问:http://localhost:9180/CookieDemo/testGetCookie.html

输出如下:

14583736-4f5e-4411-9785-f19e9190a0b4-1244746321

iii)修改cookie:

访问:http://localhost:9180/CookieDemo/testEditCookie.html

wKioL1g7jarCRuwPAACbv4y_xY0233.png

iv)删除cookie:

访问:http://localhost:9180/CookieDemo/testDelCookie.html

wKiom1g7jcyBK37sAABzYgxyoyg470.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值