2018-09-18 工作日志
Cookie
为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据
上午
JSP Cookie 处理
Cookie 通常设置在 HTTP 头信息中(虽然 JavaScript 也可以直接在浏览器上设置一个 Cookie)
默认响应头示例:
Content-Type:text/html;charset=UTF-8
Date:Tue, 18 Sep 2018 08:39:04 GMT
`Set-Cookie`:JSESSIONID=F10C53BE604986FBCE3…B7; Path=/cookieweb(这是应用名); HttpOnly
//jsessionid ==request.getSession().getId()
一般
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=runoob; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=runoob.com
Connection: close
Content-Type: text/html
Set-Cookie
信息头包含一个键值对,一个GMT(格林尼治标准)时间,一个路径,一个域名。键值对会被编码
为URL。有效期域是个指令,告诉浏览器在什么时候之后
就可以清除这个cookie。
如果请求路径页面匹配了cookie中的路径和域名,那么浏览器将会重新将这个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
JSP脚本通过request对象中的getCookies()方法来访问这些cookie,这个方法会返回一个Cookie对象的数组。
Cookie[] cookies = request.getCookies();
Cookie对象中常用的方法
//设置cookie的域名
public void setDomain(String pattern)
//获取cookie的域名
public String getDomain()
//设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间
public void setMaxAge(int expiry)
//获取cookie有效期,以秒为单位,**默认为-1** ,表明cookie会活到浏览器关闭为止
public int getMaxAge()
//返回 cookie的名称,名称创建后将不能被修改
public String getName()
//设置 cookie的值
public void setValue(String newValue)
//获取cookie的值
public String getValue()
//设置cookie的路径,默认为当前页面目录下的所有URL,还有此目录下的所有子目录
public void setPath(String uri)
//什么时候发送cookie? 当请求的路径等于cookie的路径,或者是cookie路径的子路径时才会发送。
//某个cookie路径设置为根路径后,浏览器对所有路径(页面)的请求都发送该cookie(同一个会话中)。
//获取cookie 的路径
public String getPath()
//指明cookie是否要加密传输
public void setSecure(boolean flag)
//设置注释描述 cookie的目的。当浏览器将cookie展现给用户时,注释将会变得非常有用
public void setComment(String purpose)
//返回描述cookie目的的注释,若没有则返回null
public String getComment()
使用JSP创建Cookie
- 创建一个Cookie对象
Cookie cookie = new Cookie("key","value");
名称和值中都不能包含空格或者如下的字符:[ ] ( ) = , " / ? @ : ;
- 设置有效期(以秒为单位)
cookie.setMaxAge(60*60*24);
seconds<0;cookie存在内存中。
seconds>0;cookie存在硬盘中。
如果不设置过期时间,则会话期间cookie有效(直到关闭浏览器)
- 将cookie发送至HTTP响应头中
response.addCookie(cookie);
cookie修改:
//cookie修改
for (Cookie c : cookies) {
if (c.getName().equals("huang")) {
c.setValue("昭鸿");
response.addCookie(c);
break;
}
}
使用 JSP 读取 Cookie
//String str= URLEncoder.encode("中文","utf-8");
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cooky : cookies) {
out.print(cooky.getName() + ":" + cooky.getValue() + "
");
}
使用JSP删除Cookie
- 获取一个已经存在的cookie。
- 将cookie的有效期设置为0。
- 将这个cookie重新添加进响应头中。
第二次运行该页面时,名为“huang”的cookie不见了。
Cookie[] cookies = request.getCookies();
//cookie删除
for (Cookie c : cookies) {
if (c.getName().equals("huang")) {
//修改生命时间
c.setMaxAge(0);
response.addCookie(c);
break;
}
}
下午
cookie的路径
在默认情况下,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。
cookie路径的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的那些Cookie归还给服务器
session
一类用来在客户端和服务器之间保持状态的解决方案
[术语session][1]
Servlet Session维持方式
- cookie
一个 Web 服务器可以分配一个唯一的 session 会话 ID(上述的JSESSIONID)作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。 - 隐藏的表单字段
- URL 重写
- HttpSession 对象
Servlet容器使用HttpSession接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。
通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象:
//在向客户端发送任何文档内容之前调用 request.getSession()
HttpSession session = request.getSession();