JAVA EE(三) —— Servlet 2(Cookie、Session、会话跟踪)

一、Cookie

1、Cookie 概述

(1)介绍

  • Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息,解决了发送的不同请求的数据共享问题。
  • Cookie属于客户端(浏览器端)的数据存储技术,存储的数据生命在服务器端。

(2)作用
Cookie能够解决在发送了不同请求后的数据共享问题

2、Cookie 使用步骤

创建Cookie对象,绑定数据。调用带有 cookie 名称和 cookie 值的 Cookie 的构造函数,cookie 名称和 cookie 值都是字符串。

new Cookie(String name, String value);

设置最大生存周期:使用 setMaxAge(int expiry) 方法来设置 Cookie 可以保存的最长时间,单位为秒,如

c.setMaxAge(10);

当超过设定的最大时间之后,Cookie 会消失,再次加载网页时,不会再获取到之前存入的Cookie

响应 Cookie 对象给客户端。

response.addCookie(Cookie cookie);

获取Cookie,拿到 Cookie 数据数组

Cookie[] cookies = request.getCookies();

遍历数组获取 Cookie 信息,如for循环

	if(cookies != null){
		for(Cookie c: cookies){
			String name = c.getName();
			String value = c.getValue();
		}
	}

(3)Cookie示例
利用Cookie显示上次刷新网页时间

@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		Cookie[] cookie = request.getCookies();
		if(cookie != null) {
			for(int i = 0; i < cookie.length; i++) {
				if(cookie[i].getName().equals("time")) {
					response.getOutputStream().write(("上次登录时间:" + cookie[i].getValue() + "\n").getBytes("utf-8"));
				}
			}
		}
		String time = new Date().toLocaleString();
		Cookie c = new Cookie("time", time);
		response.addCookie(c);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

3、Cookie 的删除

  • 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
  • 使用 setMaxAge() 方法设置 cookie 的年龄为零(setMaxAge(0)),来删除现有的 cookie。
  • 把这个 cookie 添加到响应头。

Cookie可以设置临时存储也可以设置定时存储
临时存储:数据存储在浏览器的云个性内存中,历览器关闭Cookie即失效
定时存储:设置cookie的有效期,数据存储在客户端的硬盘中,在有效期内的有效请求都会附带该cookie信息,,如设置一个cookie的有效期为七天

Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(7*24*60*60);

4、Cookie 注意

  • 一个 Cookie 对象存储一条数据,多条数据可以创建多个 Cookie 对象进行存储,分别使用 response 调用 addCookie() 方法发送 Cookie;
  • 在tomcat 8 之前 Cookie 不能直接存储中文数据,需要将中文数据转码,一般使用URL编码,在tomcat 8 之后 Cookie 支持中文数据;
  • 在一个 tomcat 服务器下中,默认情况下 Cookie 不能共享,使用 setPath(String path) 设置 Cookie 的获取范围,如设置 path 为"/",就可以实现共享,默认情况下 path 设置为当前的虚拟目录。
  • Cookie 临时存储是存储在浏览器的运行内存中,浏览器关闭即失效,设定有效期进行定时储存是存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
  • 默认 Cookie 信息存储好之后,每次请求都会附带,除非设置有效路径。
Cookie cookie = new Cookie();
cookie.setPath(String uri);

二、session

1、session 概述

(1)介绍

  • Session 是服务器端会话技术,在一次会话的多次请求间请求共享数据,将数据保存在服务器端的对象中,Session 对象由服务器进行创建,依赖于 Cookie 技术。
  • HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
  • 用户第一次访问服务器,服务器会创建一个 Session 对象给此用户,并将该 Session 对象的 JSESSIONID 使用 Cookie 技术存储到浏览器中,保证用户的其他请求能够获取到同一个 Session 对象,也保证了不同请求能够获取到共享的数据。

(2)session的原理
用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用Cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据。

(3)特点
session由服务器创建,存储在服务器端,其依赖与cookie技术,session的有效期为一次会话。

2、Session 使用步骤

(1)创建/获取 Session 对象

HttpSession session = request.getSession();

在服务器第一次执行 getSession() 方法,执行时会首先判断当前浏览器是否携带JSESSIONID 的 Cookie。

  • 如果有携带,会判断携带的 JSESSIONID 在服务器中是否能够获取到对应的 HttpSession 对象,如果能够获取到就直接返回该 Session 对象
  • 如果没有 JSESSIONID ,就重新创建一个 Session 对象,并且将新的 JSESSIONID 以 Cookie 数据存储到浏览器。
  • 如果 Session 对象失效了,也会重新创建一个 Session 对象,并将其 JSESSIONID 存储在浏览器内存中。

(2)使用Session对象

//存储数据
void setAttribute(String name, Object value);
//取出数据
Object getAttribute(String name);
void removeAttribute(String name);

(3)session 失效处理
将用户请求中的 JSESSIONID 和后台获取到的 session 对象的 JSESSIONID 进行比对,如果一致则 session 没有失效,如果不一直则说明 session 失效了。

3、Session 注意

(1)当客户端关闭后,服务器不关闭,两次获取 Session 默认情况下不是同一个,即 JSESSIONID 是存储在 Cookie 的临时存储空间中,浏览器关闭即失效。如果需要两次获取的 Session 是同一个,可以创建 Cookie,键为 JSESSIONID,设置最大存活时间,让 Cookie 持久化保存。

Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);

(2)客户端不关闭,服务器关闭后,两次获取的 session 不是同一个,但是要确保数据不丢失,tomcat 自动完成以下工作:

  • session 的钝化:在服务器正常关闭之前,将 session 对象系列化到硬盘上;
  • session 的活化:在服务器启动后,将 session 文件转化为内存中的 session 对象即可。

(3)Session 的销毁

  • session 在服务器关闭的时候会被销毁;
  • session 在 session 对象调用 invalidate() 方法时会被销毁(强制失效、立即失效);
  • session 在 session 对象调用 setMaxInactiveInterval(多少秒) 方法,时间达到之后会被销毁(如果指定时间内又发送了一次请求,会重新开始计时)。
  • session 默认失效时间为30分钟,可以通过选择性配置修改。(全局session有效)
<session-config>
	<session-timeout>30</session-timeout>
</session-config>

4、session对象

(1)ServletContext对象

  • ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。

ServletContext对象特点
由服务器创建,用户共享,一个项目只有一个ServletContext对象,其作用域在整个项目内

获取ServletContext对象

  • 第一种方式
ServletContext sc1 = this.getServletContext();
  • 第二种方式
ServletContext sc2 = this.getServ1etConfig( ).getServletContext();
  • 第三种方式
ServletContext sc3 = request.getSession().getServletContext();

ServletContext对象数据共享

//存储数据
sc1.setAttribute("str","ServletContext 数据共享");
//获取数据
sc1.getAttribute("str");

获取项目中web . xml文件中的全局配置数据

根据键的名字返web. xml中配置的全局数据的值,返回String类型,如果数据不存在返回null。
sc.getInitParameter(String name); 
返回键名的枚举
sc.getInitParameterNames() ;

配置方式

<context-param>
	<param-name>name</param-name>
	<param-value>zhangsan</param-value>
</context-param>

一组<context-param>标签只能存储一组键值对数据,多组可以声明多个<context-param>进行存储。

(2)ServletConfig对象
ServletConfig对象是Servlet 的专属配置对象,每个Servlet 都单独拥有一个ServletConfig 对象,用来获取web.xml中的配置信息。

获取ServletConfig对象

Serv1etConfig sc=this.getServ1etConfig();
//获取web.xml中的配置数据
String code=sc.getInitParameter("name");

web.xml文件的配置

<init-param>
	<param-name>name</param-name>
	<param-value>value</param-value>
</init-param>

5、Cookie 和 Session 的区别

(1)Session 存储数据在服务器端,Cookie 存储数据在客户端;
(2)Session 没有数据大小限制,Cookie 有数据大小限制;
(3)Session 数据安全,Cookie 数据相对不安全。

三、会话跟踪技术

1、会话跟踪概述

(1)会话跟踪介绍
会话跟踪指的是对同一个用户对服务器的连接的请求和接受响应的监视。

(2)会话跟踪作用
浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是“无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才有会话跟踪技术来实现这种要求。

2、会话跟踪常用的方法

(1)URL重写

  • URL(统一资源定位符)是Web上特定页面的地址,URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户。

(2)隐藏表单域

  • 将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示

(3)Cookie

  • Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
  • 客户端可以采用俩种方式来保存这个Cookie对象,一种方式是保存在客户端内存中,称为临时Cookie,浏览器关闭后这个Cookie对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是这个Cookie在有效期内,这样就实现了对客户的跟踪。
  • Cookie是可以被禁止的。

(4)Session

  • 每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。
  • 在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
  • Seesion的实现依赖于Cookie,如果Cookie被禁用,那么session也将失效。
发布了104 篇原创文章 · 获赞 58 · 访问量 7514

猜你喜欢

转载自blog.csdn.net/baidu_27414099/article/details/104755003
今日推荐