Servlet学习系列(四)

一、会话技术

(一)、什么是会话技术

用户打开浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,这个过程称之为一个会话。

(一)、会话技术解决什么问题

保存各个客户端自己的数据,每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要为每个用户保存这些数据。

二、Cookie与Session介绍

(一)、Request域和ServletContext存储数据存在的问题

1、Request域

使用request域存储的问题,request域的生命周期为请求开始时创建,请求结束后销毁,没有办法进行对多个数据进行存储。

2、ServletContext域

使用servletcontext存在的问题,servletcontext生命周期较长,服务器启动时创建,服务器关闭时销毁,数据存放在这里容易导致各个浏览器之间的数据混淆,浪费浏览器资源。

(二)、Cookie

Cokie是一种会话技术,也是一个域,它也可以进存储保存数据。

Cookie技术就服务器将数据存入浏览器缓存区,当服务器使用时就会去客户浏览器调用。

(三)、Session

Session也是一个域,它和Cookie不同它是,存储在服务器的,当浏览器访问服务器时创建,他会单独为该浏览器开辟一个Seeion域存储该浏览器的数据,当服务关闭或过期时被销毁。

三、Cookie的使用

(一)、将Cookie存入浏览器缓存区

  1. 创建Cookie
    • Cookie cookie = new Cookie(String cookieName,StringcookieValue);
    • Cookie会以会相应头的形式发送给客户端
    • Cookie只能存储非中文的字符串
  2. 响应给浏览器
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
    
    
//		1、创建Cookie
		Cookie cookie = new Cookie("name1","Cookie");
//		2、响应给浏览器
		response.addCookie(cookie);
	}

}

访问结果

  • 第一次访问(获取当前的时间,并把它写到cookie当中,响应给浏览器)

  • 第二次访问(请求头当中就能够看到cookie信息)

  • 访问服务器的任何资源,一般情况下都会把cookie带去过

(二)、设置Cookie持久化存储的时间

默认情况下Cookie是会话级别的,就是打开浏览器,关闭浏览器视为一次会话。如果不设置它持久化存储的时间,Cookie会存储在浏览器的内存中,浏览器关闭时Cookie信息销毁。
设置存储时间

@WebServlet("/CookieServlet")
public class CookieServlet2 extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
    
    
//		1、创建Cookie
		Cookie cookie = new Cookie("name1","Cookie");
//		设置持久化存储时间
		cookie.setMaxAge(60);
		
//		2、响应给浏览器
		response.addCookie(cookie);
	}
}

注意:

设置时间的单位为秒,如果设置了持久化存储时间,cookie信息就会被存储到浏览器磁盘文件里,过期后会自动删除。

(三)、设置Cookie的携带路径

访问某一个资源时,要不要每次都携带cookie信息,如果外部资源每次都携带,会影响传输的速度。
如果不设置携带路径,默认情况下在访问创建cookie的web资源相同的路径相同都携带cookie信息。

@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
//		1、创建Cookie
		Cookie cookie = new Cookie("name1","Cookie");
//		设置持久化存储时间
		cookie.setMaxAge(60);
//		设置携带路径    默认路径:http://localhost:8080/Cookie/CookieServlet
		cookie.setPath("/Cookie/CookieServlet");
//		2、响应给浏览器
		response.addCookie(cookie);
	}

}

(四)、删除Cookie细腻信息

删除Cookie信息就是将setMaxAge(0)方法的参数设置为0即可。

protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
    
    
//		1、创建Cookie
		Cookie cookie = new Cookie("name1","Cookie");
//		删除Cookie信息
		cookie.setMaxAge(0);

(五)、获取指定的Cookie

通过Request对象的getCookies()方法获取所有的cookie信息,要进行遍历,找出自己需要的即可

@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
    
    
//		获取所有的coookie
		Cookie[] cookies = request.getCookies();
		if(cookie != null) {
    
    
			for (Cookie C : cookies) {
    
    
				String name = C.getName();
				if(name.equals("name")) {
    
    
					response.getWriter().write("name = value"+C.getValue());
				}
			}
		}
	}
}

四、Session使用

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间,Session需要借助于Cookie存储客户的唯一性标识SESSIONID。

(一)、Session域的生命周期

  1. 创建
    • 第一次执行request.getSession()时创建。
  2. 销毁
    • 服务器关闭时
    • session过期/失效(默认30分钟),是从最后一次操作结束时计时
    • 手动销毁,调用invalidate()方法
  3. 作用范围
    • 默认在一次会话中,也就是说在一次会话中任何资源公用一个session对象

(二)、Session域持久化JSessionID

因为session是会话级别的,所以当把对象放入到session 中时,只在当前对话窗口中的session中存在。当当前窗口关闭时,session就会没了。当我们想要持久化这个session时,我们需要用到cooik中的JSESSIONID。我们先了解一下session的运行机制.

  1. 第一次向服务器发送请求时在服务器端创建Session对象,该对象有一个唯一的ID

  2. 在创建Session对象的同时会创建一个特殊的Cookie对象,该Cookie对象的名字是一个固定值JSESSIONID,该对象的值就是Session对象的ID值,同时会将这个特殊的Cookie对象发送给浏览器.

  3. 以后浏览器在发送就会携带这个特殊的Cookie对象

  4. 服务器获取JESSIONID的这个Cookie对象的value之后,在服务器中查找与之想对应的Session对象,来区分不同的用户
    session对象的获取 :HttpSession session = request.getSession()

所以我们想要持久化Session对象,我们只需要持久化JSESSIONID对应的Cookie对象就可以了。
//获取Cookie对象
         Cookie[] cookies = request.getCookies();
         if(cookies != null){
    
    
             for (Cookie cookie : cookies) {
    
    
                 //获取Cookie的名字
                 String name = cookie.getName();
                 if("JSESSIONID".equals(name)){
    
    
                      //持久化该Cookie对象
                      cookie.setMaxAge(60);
                      //将Cookie对象发送给浏览器
                      response.addCookie(cookie);
                 }
             }
         }

这样的话就把session持久化了,其实,session就是一种特殊的Cookie.

猜你喜欢

转载自blog.csdn.net/weixin_44676935/article/details/105515011