Java Web三大作用域对象:
- HttpServletRequest
- HttpSession
- ServletContext
1.Session与Cookie
1.1 Session
A session is a group of user interactions with your website that take place within a given time frame.
会话是在给定时间范围内发生的一组用户与网站的互动。
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session的数据存储在Tomcat服务器的内存中,具有时效性。
1.2 Cookie
cookie
是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
服务器生成cookie,发送给浏览器,浏览器把cookie以kv
形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。
Cookie的方法
javax.servlet.http.Cookie; | 描述 |
---|---|
public void setDomain(String pattern) | 设置 cookie 的域名,比如 loserwang.com |
public String getDomain() | 获取 cookie 的域名,比如loserwamg.com |
public void setMaxAge(int expiry) | 设置 cookie 有效期,以秒为单位,默认有效期为当前session的存活时间 |
public int getMaxAge() | 获取 cookie 有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止 |
public String getName() | 返回 cookie 的名称,名称创建后将不能被修改 |
public void setValue(String newValue) | 设置 cookie 的值 |
public String getValue() | 获取cookie的值 |
public void setPath(String uri) | 设置 cookie 的路径,默认为当前页面目录下的所有 URL,还有此目录下的所有子目录 |
public String getPath() | 获取 cookie 的路径 |
public void setSecure(boolean flag) | 指明 cookie 是否要加密传输 |
public void setComment(String purpose) | 设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用 |
public String getComment() | 返回描述 cookie 目的的注释,若没有则返回 null |
实现Cookie
//(1) 创建一个 Cookie 对象
Cookie cookie = new Cookie("key","value");
//(2) 设置最大生存周期
cookie.setMaxAge(60*60*24);
//(3) 发送 Cookie 到 HTTP 响应头
response.addCookie(cookie);
中文编码
Servlet Cookie 处理需要对中文进行编码与解码,方法如下:
String str = java.net.URLEncoder.encode("中文","UTF-8"); //编码
String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // 解码
1.3 Session跟踪
Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。
每一个Session都有其Sessiond
,浏览器和服务器之间通过SessionID
进行跟踪会话,有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话
- Cookie : 一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。这可能不是一个有效的方法,因为很多浏览器不支持 cookie,所以我们建议不要使用这种方式来维持 session 会话。
- URL 重写 : 您可以在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。例如,http://w3cschool.cc/file.htm;sessionid=12345。
- 隐藏的表单字段 : 一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID,如下所示:
<input type="hidden" name="sessionid" value="12345">
1.4 HttpSession 对象
javax.servlet.http.HttpSession ; | 描述 |
---|---|
public Object getAttribute(String name) | 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
public Enumeration getAttributeNames() | 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
public long getCreationTime() | 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
public String getId() | 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
public long getLastAccessedTime() | 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
public int getMaxInactiveInterval() | 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
public void invalidate() | 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
public boolean isNew() | 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
public void removeAttribute(String name) | 该方法将从该 session 会话移除指定名称的对象。 |
public void setAttribute(String name, Object value) | 该方法使用指定的名称绑定一个对象到该 session 会话。 |
public void setMaxInactiveInterval(int interval) | 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
HttpSessiony原理:
Tomcat服务器会自动为每一个浏览器请求创建一个有SessionId的Session,然后每次以Cookie的形式将SeesionId返回浏览器,浏览器下次访问就携带这个Cookie:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接受请求发来的参数
String name = req.getParameter("name");
String password = req.getParameter("password");
HttpSession session = req.getSession();
session.setAttribute("name", name);
session.setAttribute("password", password);
resp.getWriter().println("<p>name : " + name + "</p>" );
resp.getWriter().println("<p>password : " + password + "</p>" );
System.out.println(session.getId());
}
当访问相应网页后,结果如下: