基于SpringMVC的Cookie常用操作详解

本文涉及的产品
.cn 域名,1个 12个月
简介:

在下面的内容中,我将介绍基于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的一些参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     @RequestMapping ( "/hello.html" )
     public  ModelAndView hello( @CookieValue (name= "hitCounter" ,defaultValue= "0" )Long hitCounter,HttpServletResponse response){
         ModelAndView mAndView =  new  ModelAndView( "hello" );
         
         hitCounter++;
         
         Cookie hit =  new  Cookie( "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);
         
         return  mAndView;
     }

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

(2)hello.jsp页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
< html >
< head >
< meta  http-equiv = "Content-Type"  content = "text/html; charset=UTF-8" >
< title >SpringMVC Cookie Demo</ title >
</ head >
< body >
     < div  align = "center" >
         < h2 >SpringMVC Cookie Demo</ h2 >
     
         Page hit counter: < b > ${cookie.hitCounter.value} </ b >
     </ div >
</ body >
</ html >

最后的显示效果如下:

wKiom1g7jRyj6LplAACLJuB9hUg651.png

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

三 Cookie的增删改查示例

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package  cn.zifangsky.utils;
 
import  javax.servlet.http.HttpServletResponse;
 
import  javax.servlet.http.Cookie;
import  javax.servlet.http.HttpServletRequest;
 
public  class  CookieUtils {
 
     
 
     /**
      * 添加一个新Cookie
     
      * @author zifangsky
      * @param response
      *            HttpServletResponse
      * @param cookie
      *            新cookie
     
      * @return null
      */
     public  static  void  addCookie(HttpServletResponse response, Cookie cookie) {
         if  (cookie !=  null )
             response.addCookie(cookie);
     }
 
     /**
      * 添加一个新Cookie
     
      * @author zifangsky
      * @param response
      *            HttpServletResponse
      * @param cookieName
      *            cookie名称
      * @param cookieValue
      *            cookie值
      * @param domain
      *            cookie所属的子域
      * @param httpOnly
      *            是否将cookie设置成HttpOnly
      * @param maxAge
      *            设置cookie的最大生存期
      * @param path
      *            设置cookie路径
      * @param secure
      *            是否只允许HTTPS访问
     
      * @return null
      */
     public  static  void  addCookie(HttpServletResponse response, String cookieName, String cookieValue, String domain,
             boolean  httpOnly,  int  maxAge, String path,  boolean  secure) {
         if  (cookieName !=  null  && !cookieName.equals( "" )) {
             if  (cookieValue ==  null )
                 cookieValue =  "" ;
 
             Cookie newCookie =  new  Cookie(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
     
      * @author zifangsky
      * @param response
      *            HttpServletResponse
      * @param cookieName
      *            cookie名称
      * @param cookieValue
      *            cookie值
      * @param domain
      *            cookie所属的子域
     
      * @return null
      */
     public  static  void  addCookie(HttpServletResponse response, String cookieName, String cookieValue, String domain) {
         addCookie(response, cookieName, cookieValue, domain,  true , CookieConstantTable.COOKIE_MAX_AGE,  "/" false );
     }
 
     /**
      * 根据Cookie名获取对应的Cookie
     
      * @author zifangsky
      * @param request
      *            HttpServletRequest
      * @param cookieName
      *            cookie名称
     
      * @return 对应cookie,如果不存在则返回null
      */
     public  static  Cookie getCookie(HttpServletRequest request, String cookieName) {
         Cookie[] cookies = request.getCookies();
 
         if  (cookies ==  null  || cookieName ==  null  || cookieName.equals( "" ))
             return  null ;
 
         for  (Cookie c : cookies) {
             if  (c.getName().equals(cookieName))
                 return  (Cookie) c;
         }
         return  null ;
     }
 
     /**
      * 根据Cookie名获取对应的Cookie值
     
      * @author zifangsky
      * @param request
      *            HttpServletRequest
      * @param cookieName
      *            cookie名称
     
      * @return 对应cookie值,如果不存在则返回null
      */
     public  static  String getCookieValue(HttpServletRequest request, String cookieName) {
         Cookie cookie = getCookie(request, cookieName);
         if  (cookie ==  null )
             return  null ;
         else
             return  cookie.getValue();
     }
 
     /**
      * 删除指定Cookie
     
      * @author zifangsky
      * @param response
      *            HttpServletResponse
      * @param cookie
      *            待删除cookie
      */
     public  static  void  delCookie(HttpServletResponse response, Cookie cookie) {
         if  (cookie !=  null ) {
             cookie.setPath( "/" ); 
             cookie.setMaxAge( 0 );
             cookie.setValue( null );
 
             response.addCookie(cookie);
         }
     }
 
     /**
      * 根据cookie名删除指定的cookie
     
      * @author zifangsky
      * @param request
      *            HttpServletRequest
      * @param response
      *            HttpServletResponse
      * @param cookieName
      *            待删除cookie名
      */
     public  static  void  delCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
         Cookie c = getCookie(request, cookieName);
         if  (c !=  null  && c.getName().equals(cookieName)) {
             delCookie(response, c);
         }
     }
 
     /**
      * 根据cookie名修改指定的cookie
     
      * @author zifangsky
      * @param request
      *            HttpServletRequest
      * @param response
      *            HttpServletResponse
      * @param cookieName
      *            cookie名
      * @param cookieValue
      *            修改之后的cookie值
      * @param domain
      *            修改之后的domain值
      */
     public  static  void  editCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
             String cookieValue,String domain) {
         Cookie c = getCookie(request, cookieName);
         if  (c !=  null  && cookieName !=  null  && !cookieName.equals( "" ) && c.getName().equals(cookieName)) {
             addCookie(response, cookieName, cookieValue, domain);
         }
     }
}

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

1
2
3
4
5
6
7
8
9
10
package  cn.zifangsky.utils;
 
public  class  CookieConstantTable {
     // cookie的有效期默认为30天
     public  final  static  int  COOKIE_MAX_AGE =  60  60  24  30
     //cookie加密时的额外的salt
     public  final  static  String salt =  "www.zifangsky.cn" ;
     //自动登录的Cookie名
     public  final  static  String RememberMe =  "remember-me" ;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
     @RequestMapping ( "/testAddCookie.html" )
     public  ModelAndView addCookie(HttpServletResponse response){
         ModelAndView mAndView =  new  ModelAndView( "show" );
 
//      CookieUtils.addCookie(response, "test_addCookie", UUID.randomUUID().toString(), null);
         CookieUtils.addCookie(response,  "test_2" , UUID.randomUUID().toString() +  new  Random( 1000 ).nextInt(),  "localhost" );
         
         return  mAndView;
     }
     
     @RequestMapping ( "/testGetCookie.html" )
     public  void  getCookie(HttpServletRequest request){
         System.out.println(CookieUtils.getCookieValue(request,  "test_2" ));
     }
     
     @RequestMapping ( "/testEditCookie.html" )
     public  ModelAndView editCookie(HttpServletRequest request,HttpServletResponse response){
         ModelAndView mAndView =  new  ModelAndView( "show" );
         
         CookieUtils.editCookie(request, response,  "test_2" "editeditedit" "localhost" );
         
         return  mAndView;
     }
     
     @RequestMapping ( "/testDelCookie.html" )
     public  void  delCookie(HttpServletRequest request,HttpServletResponse response){
         CookieUtils.delCookie(request, response,  "test_2" );
     }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>    
< html >
< head >
< meta  http-equiv = "Content-Type"  content = "text/html; charset=UTF-8" >
< base  href="<%=basePath%>">
< title >SpringMVC Cookie Demo</ title >
</ head >
< body >
     < div  align = "center" >
         < h2 >SpringMVC Cookie Demo</ h2 >
         
         The Cookie is: < b > ${cookie.test_2.value} </ b >
     </ div >
</ body >
</ html >

(4)效果测试:

i)新建cookie:

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

wKioL1g7jX_Qde8qAACmlK65Yuc424.png

ii)获取cookie:

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

输出如下:

1
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

本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1877191,如需转载请自行联系原作者

相关文章
|
18小时前
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
|
7月前
|
前端开发 Java API
饼干探秘:深入Spring MVC中获取Cookie数据的技术解析
饼干探秘:深入Spring MVC中获取Cookie数据的技术解析
82 3
springMvc18-cookievalue注解(显示cookie的值,默认必须有值
springMvc18-cookievalue注解(显示cookie的值,默认必须有值
76 0
springMvc18-cookievalue注解(显示cookie的值,默认必须有值
|
1月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
72 4
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
209 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
2月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
35 1
|
3月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07