Servlet Cookie 处理
- Servlet 对 Cookie 的设置是直接在 HTTP 头信息中进行的,设置了 Cookie 的 Servlet 通常会发送类似的头信息:
HTTP/1.1 200 OK Date: Fri, 04 Feb 2000 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=w3cschool.cc Connection: close Content-Type: text/html |
- Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域,名称和值会被 URL 编码;
- expires 字段指定了Cookie的到期时间;
- 在浏览器被设置为储存Cookie,它会保留该信息到到期时间,如果浏览器指向任何匹配该 Cookie 的路径或域(path指定),它会重新发送 Cookie 到服务器,此时浏览器发送的头信息类似如下:
GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc) Host: zink.demon.co.uk:1126 Accept: image/gif, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Cookie: name=xyz |
- Servlet 中对于 Cookie 的添加、获取、删除主要是通过 HttpServletRequest 和 HttpServletReponse 成员方法来实现的;
- Cookie 本身的属性修改、属性获取主要通过 javax.servlet.Cookie 类来实现,主要相关的API如下:
void setDomain(String pattern) | 设置 cookie 适用的域,例如 w3cschool.cc。 |
String getDomain() | 获取 cookie 适用的域,例如 w3cschool.cc |
void setMaxAge(int expiry) | 设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效 |
int getMaxAge() | 回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。 |
String getName() | 该方法返回 cookie 的名称。名称在创建后不能改变。 |
void setValue(String newValue) | 设置与 cookie 关联的值。 |
String getValue() | 获取与 cookie 关联的值。 |
void setPath(String uri) | 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。 |
String getPath() | 获取 cookie 适用的路径。 |
void setSecure(boolean flag) | 设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送 |
void setComment(String purpose) | 设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
String getComment() | 获取 cookie 的注释,如果 cookie 没有注释则返回 null。 |
- 当Cookie中可能包含中文或其他非英文字符时,要对 Cookie 的键值进行相应的编码、解码
String encodeStr = java.net.URLEncoder.encode("中文字符串","UTF-8"); //编码String decodeStr = java.net.URLDecoder.decode("编码后的中文字符串","UTF-8"); // 解码设置/添加 Cookie 到响应头
通过 Servlet 设置添加 Cookie 一般包含以下3个步骤:
① 创建 Cookie 对象;
Cookie cookie = new Cookie("key","value");
② 设置 Cookie 的最大生命周期;
cookie.setMaxAge( 60 * 60 * 24 ); //单位时间为s,设置过期时间为24h
③ 发送 Cookie 到 HTTP 响应头;
response.addCookie( cookie );
示例代码如下:
public class Demo extends HttpServlet{ //将表单提交得到的 username 数据添加到Cookie public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{ //创建Cookie对象 Cookie username = new Cookie("username", URLEncoder.encode(request.getParameter("username"),"UTF-8") ); //设置过期时间为 24h username.setMaxAge(60 * 60 * 24); //向相应头添加 Cookie response.addCookie(username); }}获取 Cookie 从请求头
获取Cookie,只需要通过HttpRequest的getCookies() 方法获取一个 Cookie 对象数组,然后循环遍历数组使用 getName() 和 getValue() 获取数组的键值对;
示例代码如下:
public class Demo extends HttpServlet{ //获取Cookie中key为username的value public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{ String username = ""; //获取Cookie数组 Cookie[] cookies = request.getCookies(); //遍历数组,找出目标键值对 for(Cookie cookie :cookies){ if( cookie.getName().equals("username")){ username = cookie.getValue(); break; } } }}删除 Cookie
Servlet 删除 Cookie 过程如下:
- 读取一个现有的 cookie,并把它存储在 Cookie 对象中;
- 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie;
- 把这个 cookie 添加到响应头;
public class Demo extends HttpServlet{ //删除key为username的Cookie public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{ Cookie username = null; //获取Cookie数组,遍历数组找出目标Cookie对象 Cookie[] cookies = request.getCookies(); for(Cookie cookie :cookies){ if( cookie.getName().equals("username")) username = cookie; } //设置cookie为到期时间为0 username.setMaxAge(0); //将cookie添加到响应头中 response.addCookie(username); }}

本文介绍了Servlet中如何处理Cookie,包括设置、获取和删除Cookie的方法。详细解释了Cookie的属性及如何通过HttpServletRequest和HttpServletResponse进行操作。
1646

被折叠的 条评论
为什么被折叠?



