在下面的内容中,我将介绍基于SpringMVC的一些Cookie常用操作,包括:cookie的增、删、改、查
一 Cookie的属性简介
对于一个Cookie来说,一般有以下几个属性:
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}最后的显示效果如下:
然后每次刷新页面,页面中的数字都会增加
三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
ii)获取cookie:
访问:http://localhost:9180/CookieDemo/testGetCookie.html
输出如下:
14583736-4f5e-4411-9785-f19e9190a0b4-1244746321
iii)修改cookie:
访问:http://localhost:9180/CookieDemo/testEditCookie.html
iv)删除cookie:
访问:http://localhost:9180/CookieDemo/testDelCookie.html
在下面的内容中,我将介绍基于SpringMVC的一些Cookie常用操作,包括:cookie的增、删、改、查
一 Cookie的属性简介
对于一个Cookie来说,一般有以下几个属性:
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}最后的显示效果如下:
然后每次刷新页面,页面中的数字都会增加
三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
ii)获取cookie:
访问:http://localhost:9180/CookieDemo/testGetCookie.html
输出如下:
14583736-4f5e-4411-9785-f19e9190a0b4-1244746321
iii)修改cookie:
访问:http://localhost:9180/CookieDemo/testEditCookie.html
iv)删除cookie:
访问:http://localhost:9180/CookieDemo/testDelCookie.html