六、会话管理

会话

一、会话的概念

1.1 一次会话
 	打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器
1.2 会话管理
	管理浏览器和服务器之间的会话过程中产生的会话数据
1.3 如何管理会话数据

会话过程中要解决的一些问题?

	
	用户使用浏览器与服务器交互,肯定会产生用户需要的一些数据,服务器
	要想办法为每一个用户保存这些数据。

	例如:多个用户点击超链接通过一个servlet各自购买了一个商品,服务器
	应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点
	结帐servlet时,结帐servlet可以得到用户各自购买的商品为用户结帐。

提问:这些数据保存在Request或ServletContext中行不行?

	域对象:实现资源之间的数据共享。
			
			request域对象
			context域对象

	登录场景:

		1)使用context域对象保存会话数据:
		
			小张:输入“张三”(保存数据,context.setAttribute("name","张三"))-》用户主页显示“张三”
			李四:输入“李四”(保存数据,context.setAttribute("name","李四"))-》用户主页显示“李四”
			
			如果使用context保存会话数据,则会出现数据覆盖问题。
	
		2)使用request域对象保存会话数据:
			
			使用request域对象保存会话数据,一定要使用转发来保存数据,如果重定向,则数据丢失。
			
			如果使用request域对象保存会话数据,整个网站都会用转发,不合理。	

	综上,使用域对象保存会话数据,不可行。	

1.4 会话技术

		Cookie技术:把会话数据保存在浏览器客户端。
		Session技术:把会话数据保存在服务器端。

		会话技术的核心:
				1.浏览器会自动保存Set-Cookie响应头中的数据。
				2.浏览器每次访问服务器都会带着保存会话数据的Cookie的请求头。			
	 	
	 	Session技术的核心:
	 			服务器创建Session对象存储会话数据,把对象的唯一标识以
	 			Cookie的形式写给浏览器。	浏览器带着唯一标识再次访问
	 			服务器,取出会话数据。	

Cookie

	Cookie是客户端技术,服务器把每个用户的数据以cookie的形式
	写给浏览器,浏览器把会话数据保存下来,然后每次访问服务器时
	都会带着这些会话数据。

	Cookie技术: 会话数据保存在浏览器客户端。
			Cookie核心的API:
					2.1 在服务器端创建Cookie对象
							Cookeie cookie = new Cookie("name","value");
					2.2 把cookie发送给浏览器端(通过响应头:set-cookie)
							response.addCookie(cookie);
					2.3 浏览器带着cookie信息访问服务器(通过请求头:cookie),服务器得到cookie信息
							Cookie[] cookies = request.getCookies();

		局限: 
				1)只能保存字符串类型,不能保存中文
				2)一个cookie不能超过4kb

Session

	
	Sesison是服务器端技术,服务器可以为每一个浏览器创建一个独享的Session对象。
	由于Session为用户浏览器独享,所以用户在访问web资源时,可以把各自的数据放在独享的Session中。
			
	Session技术:会话数据保存在服务器端。(内存)
	Session核心的API:
				3.1 创建或得到session对象	
						HttpSession session = request.getSession(); //创建或得到session对象
						request.getSession(false); //得到session对象
				3.2 会话数据保存session对象中,和得到会话数据
						session.setAttribute("name",Object);  保存数据
						session.getAttribute("name")   得到数据
								
		注意:
				1)session.setIntactiveInterval(时间);   设置session过期时间
				2)session.invalidate()  手动销毁session对象

二、Cookie技术

2.1 特点

	Cookie技术:服务器把会话数据保存在客户端

2.2 Cookie的创建过程

Cookie类:用于存储会话数据


				1)构造Cookie对象
						Cookie ck=new Cookie("key","value");
				2)设置cookie
						void setPath(String uri)   :设置cookie的有效访问路径
						void setMaxAge(int expiry) : 设置cookie的有效时间
						void setValue(String newValue) :设置cookie的值
				3)发送cookie到浏览器端保存
						
						方式一:
						response.addCookie(Cookie cookie)  : 发送cookie
						
						方式二:
						response.setHeader("Set-Cookie","name=hlp,id=12,age=14")	
						
				4)服务器接收cookie
						
						方式一:
						Cookie[] cks=request.getCookies()  : 接收cookie
						
						方式二:
						String cookies=request.getHeader("Cookie");

服务器发送Cookie信息给浏览器:

		方式一:
			Cookie name=new Cookie("name","hlp");
			Cookie id=new Cookie("id","12");
			response.addCookie(name);
			response.addCookie(id);
		
		方式二:
			response.addCookie("Set-Cookie","name=hlp,id=12")

服务器接收浏览器携带的Cookie信息:

		方式一:
			Cookie[] cookies=request.getCookie();
		
		方式二:
			String cookies=request.getHeader("Cookie");	

2.3 Cookie的原理

代码实现

public class HelloServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {				
			
			//方式一:设置Set-Cookie响应头发送会话数据			
			//resp.setHeader("Set-Cookie","name=hlp");

			//方式二:使用respone.addCookie()发送会话数据【推荐使用】
			Cookie name_cookie=new Cookie("name","hlp");
			resp.addCookie(name_cookie);
	}
	
}

浏览器获取响应数据,会自动把Cookie信息保存下来。
在这里插入图片描述
在这里插入图片描述
然后浏览器每一次请求服务器,都会带着Cookie信息。
在这里插入图片描述

Cookie技术原理:
创建过程:

			
		1)	服务器发送cookie信息到浏览器
					Cookie cookie=new Cookie("name","value");
					response.addCookie(cookie);
					
		            实质上是发送 【set-cookie: name=eric】响应头  
		
		2)浏览器得到服务器发送的cookie,然后保存在浏览器端。
		
		3)浏览器在下次访问服务器时,会自动带着cookie信息
			   		实质上是发送 【cookie: name=eric】的请求头 
			   		
		4)服务器接收到浏览器带来的cookie信息
					request.getCookies();

总结:

			
		response.addCookie(cookie) 
				这个方法用于在响应中添加一个Set-Cookie的响应头。
				类似于:response.setHeader("Set-Cookie","name=hlp")
		
		req.getCookies()
				这个方法用于从请求中获取Cookie的请求头。
				类似于:request.getHeader("Cookie")	

		服务器把会话数据设置到Set-Cookie的响应头中,
		浏览器接收到响应后,就会自动把会话信息保存下来。
		然后浏览器每次请求服务器,都会自动携带Cookie的请求头。

		Cookie技术实质:浏览器和服务器通过一个响应头Set-Cookie和请求头Cookie来交换数据。
		

2.4 Cookie的细节

2.4.1 Cookie的有效路径

在这里插入图片描述

	
	1)如果没有设置有效路径,Cookie的有效路径默认为  /项目名。
	2)Cookie的有效路径的作用:
			只要是访问该有效路径下的任何资源,浏览器就会携带该
			Cookie,否则不携带。
	

举例:

public class Hello extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		Cookie cookie=new Cookie("name", "hlp");
		Cookie cookie2=new Cookie("name2", "hlp2");
		
		//注意:对cookie修改时,比如设置有效时间、有效路径,
		//代码一定要写在响应添加cookie之前,否则失效。
		
		//cookie.setPath("test");
		//cookie2.setPath("Demo3");
		
		resp.addCookie(cookie);
		resp.addCookie(cookie2);
		System.out.println("...");
	}
}

Cookie的有效路径默认为 /项目名。
	案例1:
		如果Cookie的有效路径默认为 /Demo ,服务器把该Cookie保存
		在浏览器,浏览器就会根据路径来判断是否携带该Cookie。
		
		当浏览器访问 http://localhost:8080/Demo/a.html
		时就会携带该Cookie。
		如果浏览器访问 http://localhost:8080/Test/a.html
		时就不会携带该Cookie。

	案例2:
		设置Cookie的有效路径 /Demo/test ,服务器把该Cookie保存
		在浏览器,浏览器就会根据路径来判断是否携带该Cookie。
		
		当浏览器访问 http://localhost:8080/Demo/test /a.html
		时就会携带该Cookie。
		如果浏览器访问 http://localhost:8080/Demo/a.html
		时就不会携带该Cookie。
2.4.2 Cookie的大小限制
	Cookie数据类型只能保存非中文字符串类型的。可以保存多个
	cookie,但是浏览器一般只允许存放300个Cookie,每个站点
	最多存放20个Cookie, 每个Cookie的大小限制为4KB。
2.4.2 会话Cookie(默认)
	设置Cookie的有效时间为负数,此时Cookie保存在浏览器的内存中。
	只要浏览器已关闭,Cookie就会消失。我们称之为这个状态下的
	cookie为会话cookie。即一次会话(浏览器开启-》访问-》关闭)中有效。

	默认情况下,我们创建的Cookie就是会话Cookie,在一次会话中有效。

2.5 Cookie的API

Cookie类:用于存储会话数据

		1)构造Cookie对象(创建)
			Cookie(java.lang.String name, java.lang.String value)
		2)设置cookie
			void setPath(java.lang.String uri)   :设置cookie的有效访问路径
			void setMaxAge(int expiry) : 设置cookie的有效时间
			void setValue(java.lang.String newValue) :设置cookie的值
		3)发送cookie到浏览器端保存(发送)
			void response.addCookie(Cookie cookie)  : 发送cookie
		4)服务器接收cookie(接收 )
			Cookie[] request.getCookies()  : 接收cookie

2.5.1 服务器发送Cookie信息给浏览器:
		方式一:
			Cookie name=new Cookie("name","hlp");
			Cookie id=new Cookie("id","12");
			response.addCookie(name);
			response.addCookie(id);
		
		方式二:
			response.addCookie("Set-Cookie","name=hlp,id=12")
2.5.2 服务器接收浏览器携带的Cookie信息:
		方式一:
			Cookie[] cookies=request.getCookies();
		
		方式二:
			String cookies=request.getHeader("Cookie");	
2.5.3 Cookie的基础设置
	1)void setPath(java.lang.String uri)   :设置cookie的有效
	访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器
	在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。
			
	2)void setMaxAge(int expiry) : 设置cookie的有效时间。
					正整数:表示cookie数据保存浏览器的缓存目录
						  (硬盘中),数值表示保存的时间。
					负整数:表示cookie数据保存浏览器的内存中。
					       浏览器关闭cookie就丢失了!!
					零:表示删除同名的cookie数据
					

设置Cookie的有效路径

	cookie.setPath("/demo/test");
	
	Cookie的有效路径默认为当前项目,其作用是只有当浏览器访问该路径下
	的资源时,才会携带该Cookie,否则不会携带。 

HttpServlet.java

public class Hello extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		
		Cookie cookie=new Cookie("name", "hlp");
		
		//浏览器访问 http://localhost:8080/demo/test/a.html 会携带该Cookie
		//浏览器访问 http://localhost:8080/demo/a.html 不会携带该Cookie
		cookie.setPath("/demo/test");
	
		resp.addCookie(cookie);
		
	}
}

设置Cookie的有效时间

	cookie.setMaxAge(-1);
		
		正整数:表示cookie保存在浏览器的缓存目录中(硬盘上)。
			   设置cookie保存的时间,单位为秒。
			   
			   只要当Cookie的有效时间到了,Cookie才会消失,
			   否则,即使浏览器关闭,也不会消失。
	
		 负整数:表示cookie保存在浏览器的内存中。
		 		浏览器只要一关闭,Cookie就会消失。
			
		 零:表示删除浏览器端的同名cookie。
		 	 删除cookie时,path必须一致,否则不会删除
		 	

设置有效时间

public class Hello extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
		Cookie cookie=new Cookie("name", "hlp");
		
		//1.负整数
		//表示会话级别Cookie,一次会话有效。(浏览器关闭就消失)
		//cookie.setMaxAge(-1);
		
		//2.零
		//表示删除同名cookie,删除cookie时,path路径要设置一致
		//cookie.setMaxAge(0);
		// cookie.setPath("/day10/test")
		
		//3.正整数:cookie保存在硬盘上20s,20s后消失。	
		cookie.setMaxAge(20);

		resp.addCookie(cookie);		
	}
}

案例1-显示用户上一次访问时间

HeeloServlet.java

public class Hello extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		Cookie[] cookies = req.getCookies();
		resp.setCharacterEncoding("utf-8");

		
		Cookie n=new Cookie("time", new Date().toGMTString());
		if(cookies==null) {	
			resp.getWriter().write("您是第一次访问,hlp");
		}else {
			
			Cookie c = cookies[0];
			resp.getWriter().write("您上一次访问时间为:"+c.getValue());
		}
		
		resp.addCookie(n);
	}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>org.hlp.demo.Hello</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
</web-app>

a.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form action="./hello">
		<input type="submit" value="提交"/>
	</form>

</body>
</html>

展示效果:
在这里插入图片描述

三、Session技术

3.1 引入

Cookie的局限:


				1)Cookie只能存字符串类型。不能保存对象
				2)只能存非中文。
				3)1个Cookie的容量不超过4KB。

			如果要保存非字符串,超过4kb内容,只能使用session技术!!!


Session特点:

				 会话数据保存在服务器端。(内存中)

3.2 Session的创建过程

代码解读: HttpSession session=req.getSession

			
			1)第一次访问会创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID
					HttpSession  session=req.getHttpSession();
			
			2)把JSESSIONID作为Cookie的值发给浏览器进行保存。
					
					实质上相当于把JESSIONID作为Set-Cookie的值发送给浏览器。类似于以下代码:
					Cookie cookie = new Cookie("JSESSIONID", sessionID);
					response.addCookie(cookie);
					
			3)第二次访问的时候,浏览器会带着JSESSIONID的cookie访问服务器
			
			4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。
					if(找到){
						return map.get(sessionID);
					}
					if(没找到){
						return new Session();
					}

				
			5)如果找到对应编号的session对象,直接返回该对象
			6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
	
			结论:通过JSESSIONID的cookie值在服务器找session对象!!!!!
		HttpSession技术:
				
				1)服务器调用req.getSession()原理分析:
						
						a.服务器会先获取JESSIONID的值,然后通过JSESSIONID的值获取
						  对应的session对象。
						
						b.如果服务器没有获取到session对象,就会创建session对象,然
						  后会将该session的JSESSIONID值以Cookie技术传给浏览器。
							
						c.浏览器会把JESSIONID的值保存下来,然后每次访问服务器都会
						   带着JESSIONID的Cookie值。							

3.3 Session的原理

代码实现
Hello1.java

public class Hello1  extends HttpServlet{
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		//获取session
		HttpSession session = req.getSession();
		
		session.setAttribute("name", "hlp");
	}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>org.jsoft.demo.Hello1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

</web-app>

浏览器第一次访问该servlet。
服务器获取JSESSIONID,然后通过JESSIONID获取session对象,如果没有获取到,就会创建session对象,然后将sesison的JSESSIONID值以Cookie的形式写给浏览器。
在这里插入图片描述
浏览器再次访问servlet。
浏览器会带着JSESSIONID的Cookie值去访问,服务器通过JSESSIONID的值获取sesison对象,然后取出服务器端的session对象,获取资源数据。

在这里插入图片描述
Session技术原理:

	req.getSession();
	
		1)服务器创建session对象。
		2)然后自动将唯一标识JSESSIONID作为Cookie的值写给浏览器,让浏览器保存下来。
			相当于
					Cookie c=new Cookie("JSESSIONID",ID);
					response.addCookie(c);
					
		3)浏览器每次访问服务器都会带着该Cookie值。
		4)服务器接收到请求后,就会根据唯一标识JSESSIONID将对应的session对象取出来。
		

3.4 Session的细节

3.4.1 Session销毁的时间

	Session默认的销毁时间是30分钟,但是由于JSESSIONID是由Cookie形式写在浏览器的,且使用
	的是默认Cookie,即一次会话有效。所以Session默认的销毁时间是30分钟,但是JSESSIONID默
	认的销毁时间是一次会话。
	

3.5 HttpSession的API

HttpSession类:用于保存会话数据

			1)创建或得到session对象
					HttpSession getSession()  
					HttpSession getSession(boolean create) 	
				 
			2)设置session对象
					void setMaxInactiveInterval(int interval)  : 设置session的有效时间,单位为秒
					void invalidate()     : 销毁session对象
					java.lang.String getId()  : 得到session编号
				
			3)保存会话数据到session对象
					void setAttribute(String name,Object value)  : 保存数据
					Object getAttribute(String name)  : 获取数据
					void removeAttribute(String name) : 清除数据
					
3.5.1 req.getSession() 与 req.getSession(boolean)
		1)
			req.getSession()
			req.getSession(true)
	
			两个方法一样,
				1)由JSESSIONID获取session对象。
				2)如果没有获取到session对象,就会创建session对象。
				 并将JSESSIONID以Cookie的形式写给浏览器。
			
		
		2)	
			req.getSession(false)
			获取session对象。获取不到返回null

3.5.2 获取session对应的JSESSIONID值

HelloServlet.java

public class HelloServlet  extends HttpServlet{
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		//获取session
		HttpSession session = req.getSession();
		
		String id = session.getId();
		System.out.println(id);
	}
}

在这里插入图片描述

3.5.3 Session的有效性

Session的有效性


		Session在服务器端默认的有效时间是三十分钟,即三十分钟后,服务器自动回收。
		JSESSIONID的默认的有效时间是一次会话。即一次会话后,浏览器丢失Cookie,从而
		导致JSESSIONID的丢失,最终导致了Session实质性的失效。
		
		总体来说,
			   Session的有效性最终是由Session在服务器端的有效时间和JSESSIONID在浏览器
			   端的有效时间共同决定的。
			 
			   Session的有效性 = Min(Session在服务器端的有效时间,JSESSONID在浏览器端有效时间)			
			   

设置Session在服务器端的有效时间(服务器端)

		
		以下两个方法只是设置了session在服务器中的有效时间。
		即使设置了Session的有效时间,也只是设置了Session在服务器中的有效时间,
		但也会由于浏览器关闭导致会话级别的Cookie丢失,从而导致JSESSIONID的丢失,
		最终导致Session实质上的失效。

		
		1)局部设置session的有效时间,单位为秒
			session.setMaxInactiveInterval(int interval)  
										设置session的有效时间,单位秒
		
		2)全局设置session的有效时间,单位为分钟
				在web.xml中配置。
				
						  <!-- 修改session全局有效时间:分钟 -->
					 	 <session-config>
								<session-timeout>1</session-timeout>
						  </session-config>	
				

1)局部设置session的有效时间

public class Hello1  extends HttpServlet{
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		//创建session
		HttpSession session = req.getSession();
		System.out.println(session.getId());
		
		//设置session的有效时间为20秒
		session.setMaxInactiveInterval(10);
	}
}

2)全局设置session的有效时间
web.xml

		<?xml version="1.0" encoding="UTF-8"?>
		<web-app version="2.5" 
			xmlns="http://java.sun.com/xml/ns/javaee" 
			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
			xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
			http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
		
		  <!-- 修改session全局有效时间:分钟 -->
		  <session-config>
				<session-timeout>1</session-timeout>
		  </session-config>
		  
		  <servlet>
		    <servlet-name>HelloServlet</servlet-name>
		    <servlet-class>org.jsoft.demo.Hello1</servlet-class>
		  </servlet>
		
		  <servlet-mapping>
		    <servlet-name>HelloServlet</servlet-name>
		    <url-pattern>/create</url-pattern>
		  </servlet-mapping>
	
		</web-app>

设置JSESSIONID在浏览器端的有效时间(浏览器端)

		将JSESSIONID以手动的形式写到Cookie,并修改Cookie的保存时间,单位为秒
		
		Cookie cookie=new Cookie("JSESSIONID",session.getId());
		cookie.setMaxAge(100);
		resp.addCookie(cookie);	
public class Hello1  extends HttpServlet{
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		//创建session
		HttpSession session = req.getSession();
		System.out.println(session.getId());
		
		//设置JSESSIONID在浏览器端的有效时间100s
		Cookie cookie=new Cookie("JSESSIONID",session.getId().toString());
		cookie.setMaxAge(100);
		resp.addCookie(cookie);			
	}
}

设置Session的有效性(设置Session整体上的有效时间)

Session的有效性由Session在服务器端的有效时间和JSESSIONID在浏览器端的有效时间共同决定。
public class Hello1  extends HttpServlet{
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		//创建session
		HttpSession session = req.getSession();
		System.out.println(session.getId());
		
		//设置Session在服务器端的有效时间为100秒
		session.setMaxInactiveInterval(100);
		
		//设置JSESSIONID在浏览器端的有效时间100s
		Cookie cookie=new Cookie("JSESSIONID",session.getId().toString());
		cookie.setMaxAge(100);
		resp.addCookie(cookie);			
	}
}

注销Session

		session.invalidate()     : 销毁session对象

public class Hello2 extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		//销毁session
		HttpSession session = req.getSession(false);
		
		if(session!=null) {
			session.invalidate();
		}
		System.out.println("删除session成功");
		
	}
}

3.6 JSP中HttpSesison的坑点

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//没有登录返回登录界面
		HttpSession session = req.getSession(false);
		System.out.println(session);
		if(session==null) {
			req.getRequestDispatcher("/login.jsp").forward(req, resp);
			return;
		}
	}

	当用户没有登录访问list界面时,我们会做session判断,如果session不存在,
	表示用户没有登录,就返回登录界面。
	但是在含有jsp项目的页面中,会出现bug。
	
	由于jsp本身含有内置对象session。当用户访问jsp页面时,即使没有登录,
	但是也自动创建了session。这时,用户在登录list页面,就会由于session的存在而展示数据。
	
	所以不能以session存在来判断用户是否登录。

四、总结


		1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据
		2)Cookie技术: 会话数据保存在浏览器客户端。
				Cookie核心的API:
						2.1 在服务器端创建Cookie对象
								Cookeie cookie = new Cookie("name","value");
						2.2 把cookie发送给浏览器端(通过响应头:set-cookie)
								response.addCookie(cookie);
						2.3 浏览器带着cookie信息访问服务器(通过请求头:cookie),服务器得到cookie信息
								Cookie[] cookies = request.getCookies();

				局限: 
						1)只能保存字符串类型,不能保存中文
						2)一个cookie不能超过4kb
					
		3)Session技术:会话数据保存在服务器端。(内存)
				Session核心的API:
						3.1 创建或得到session对象	
								HttpSession session = request.getSession(); //创建或得到session对象
								request.getSession(false); //得到session对象
						
						3.2 会话数据保存session对象中,和得到会话数据
								session.setAttribute("name",Object);  保存数据
								session.getAttribute("name")   得到数据
										
				注意:
						1)session.setIntactiveInterval(时间);   设置session过期时间
						2)session.invalidate()  手动销毁session对象
						
发布了94 篇原创文章 · 获赞 0 · 访问量 659

猜你喜欢

转载自blog.csdn.net/weixin_45602227/article/details/103571487