2.3 Java Servlet 会话管理 使用Cookies
2.3 Cookies
URL重写
和隐藏域
仅适合保存无须跨越太多页面
的信息。如果需要在多个页面间传递信息,则以上两种技术实现成本高昂,因为你不得不在每个页面都进行相应处理。幸运的是,Cookies
技术可以帮助我们。Cookies
是一个很少的信息片段,可自动地在浏览器和Web
服务器间交互,因此cookies
可存储在多个页面间传递的信息。Cookie
作为HTTP header
的一部分,其传输由HTTP
协议控制。此外,你可以控制cookies
的有效时间。浏览器通常支持每个网站高达20个cookies
。Cookies
的问题在于用户可以通过改变其浏览器设置来拒绝接受cookies
。
要使用cookies
,需要熟悉javax.servlet.http.Cookie
类以及HttpServletRequest
和HttpServletResponse
两个接口。
创建Cookies
可以通过传递name
和value
两个参数给Cookie
类的构造函数来创建一个cookies
:
1 | Cookie cookie = new Cookie(name, value); |
如下是一个创建语言选择的cookie
示例:
1 | Cookie languageSelectionCookie = new Cookie("language", "Italian"); |
Cookie属性
创建完一个Cookie
对象后,你可以设置domain
、 path
和maxAge
属性。其中,maxAge 属性决定cookie何时过期。
服务器如何发送Cookie
要将cookie
发送到浏览器,需要调用 HttpServletResponse
的add
方法:
1 | httpServletResponse.addCookie(cookie); |
浏览器如何发送Cookie
浏览器在访问同一Web
服务器时,会将之前收到的 cookie
一并发送。 此外,Cookies
也可以通过客户端的javascript
脚本创建和删除。
服务器端如何读取浏览器提交的Cookie
服务端若要读取浏览器提交的cookie
,可以通过 HttpServletRequest
接口的getCookies
方法,该方法返回一个Cookie
数组,若没有Cookies
则返回null
.
查找Cookie
你需要遍历整个数组来查询某个特定名称的cookie
。如下为查询名为maxRecords
的cookie
的示例:
1 | //获取浏览器提交的所有Cookie数组 |
目前,还没有类似于getCookieByName
这样的方法来帮助简化工作。
删除Cookie
没有一个直接的方法来删除一个cookie
,你只能创建一个同名的Cookie
,并将maxAge
属性设置为0
,并添加到HttpServletResponse
接口中,覆盖掉原来的Cookie即可。如下为删除一个名为userName
的cookie
代码:
1 | Cookie cookie = new Cookie("userName", ""); |
demo
工具类
1 | package session.management.cookies; |
设置Cookie的Servlet
1 | package session.management.cookies; |
这个Servlet会把表单输入转换为Cookie发送到浏览器,对应的URL为http://localhost:8080/SessionManagement/setcookie,
当浏览器再次访问http://localhost:8080/SessionManagement/
这个Java项目下的资源时,浏览器会把之前服务器发给他的Cookie,再原封不动的提交给服务器。这样服务器就可以根据Cookie来进行响应的操作。
在上面代码中,服务器分别发送fruitNum
和cookieFontSize
这两个cookie给浏览器,下面将再创建两个Servlet来使用者连个Cookie。
填写表单,如下所示:
然后点击Set按钮,提交表单,得到提示如下:
根据Cookie显示数组中的元素
ShowFruitsByCookie
这个Servlet会根据fruitNum
这个Cookie的值,来显示打印数组中的元素,如下所示:
1 | package session.management.cookies; |
点击工具条上的Show Fruits
超链接,效果如下:
根据Cookie设置CSS
SetCSSByCookie
这个Servlet根据cookieFontSize
这个Cookie中的值来来设置元素的CSS样式,如下所示:
1 | package session.management.cookies; |
点击工具条上的Show CSS
超链接,显示效果如下: