会话管理

会话管理技术
会话管理: 管理浏览器与服务器之间的会话过程中产生的会话数据。 Cookie技术:会话数据保存在浏览器端。 Session技术: 会话数据保存在服务器端。
Cookie技术

Cookie技术的使用
Cookie对象:步骤
(1)创建Cookie对象,用于存储会话数据
new Cookie(java.lang.String name, java.lang.String value)
(2)修改Cookie对象
void setPath(java.lang.String uri)
void setMaxAge(int expiry)
void setValue(java.lang.String newValue)
(3)把cookie数据发送给浏览器保存
response.addCookie(cookie);
(4)浏览器带着cookie访问服务器,服务器接收cookie信息
request.getCookies();
非简化版本:

package cn.web001;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletCookie extends HttpServlet {
     
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
		//创建Cookie对象,保存会话数据
		Cookie cookie = new Cookie("name","miemie");
		//把cookie数据发送给浏览器保存,通过响应头携带cookie数据给浏览器(set-cookie)
		response.setHeader("set-cookie", "name=miemie");
		//浏览器在下次访问的时候携带了cookie数据,通过请求头发送给服务器(cookie)
		//服务器获取浏览器发送的cookie数据
		String header = response.getHeader("name");
		System.out.println(header);
	}
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        
	}

}

会话管理_第1张图片
会话管理_第2张图片
简化版本(面向对象)

package cn.web001;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletCookie extends HttpServlet {
     
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
		//创建Cookie对象,保存会话数据
		Cookie cookie = new Cookie("name","miemie");
		//把cookie数据发送给浏览器保存,通过响应头携带cookie数据给浏览器(set-cookie)
		//response.setHeader("set-cookie", "name=miemie");
		response.addCookie(cookie);
		//浏览器在下次访问的时候携带了cookie数据,通过请求头发送给服务器(cookie)
		//服务器获取浏览器发送的cookie数据
		//String header = response.getHeader("name");
		//System.out.println(header);
		//简化版本
		Cookie[] cookies = request.getCookies();
		if(cookies!=null) {
     
		    for(Cookie cookie1:cookies) {
     
				String name= cookie1.getName();
				String value = cookie1.getValue();
				System.out.println(name+"="+value);
			}
		}else {
     
			System.out.println("nullcookie");
		}
	}
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        
	}

}

会话管理_第3张图片

Cookie技术原理

(1)服务器创建Cookie对象,保存会话数据,把Cookie数据发送给浏览器
response.addCookie(cookie); (响应头:set-cookie: name=jacky)
(2)浏览器获取cookie数据,保存在浏览器缓存区,然后在下次访问服务器时携带cookie数据
(请求头: cookie: name=jacky)
(3)服务器获取浏览器发送的cookie数据
request.getCookies();

Cookie细节

(1)cookie的数据类型一定是字符串,如果要发送中文,必须先对中文进行URL加密才可以发送。
(2)setPath(path): 修改cookie所在的有效路径。 如果把该cookie设置到某个有效路径下,然后当浏览器访问这个有效路径的时候,才会携带cookie数据给服务器。
(3) setMaxAge(整数) : 设置cookie的有效时间
正整数: 表示超过了正整数的数值的时间,cookie就会丢失(cookie保存浏览器的缓存。 目录)单位:秒
负整数: 表示如果浏览器关闭了,cookie就会丢失(cookie保存浏览器内存)。
0 : 表示删除同名的cookie 。
(4)cookie可以有多个,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

Session技术

Cookie特点:
1)会话数据放在浏览器端
2)数据类型只能string,而且有大小限制的
3)相对数据存放不安全。

Session特点:
1)会话数据放在服务器端(服务器内存),占用服务器资源
2)数据类型任意类型,没有大小限制的。
3)相对安全

Session使用步骤

HttpSession对象:
1)创建HttpSession对象,用于保存会话数据
session = request.getSession(); 创建或获取session对象
2)修改HttpSession对象
void setMaxInactiveInterval(int interval) 设置session对象的有效时间
void invalidate() 手动销毁session对象
3)保存会话数据(作为域对象)
session.setAttribute(“name”,Object); 保存数据
session.getAttribute(“name”) 获取数据
session.removeAttribute(“name”) 删除数据
会话管理_第4张图片

Session原理

可以从session对象取出数据必须是存放数据的sessinon对象。
HttpSession session = request.getSession();含义((1)-(6))
(1)服务器创建Session对象,服务器会给这个session对象分配一个唯一的标记JSESSIONID。
(2)把JSESSIONID作为Cookie发送给浏览器。
(3)浏览器得到JSESSIONID保存下来,在下次访问时携带这个JSESSIONID去访问服务器。
(4)服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSSESSINOID的session对象。
(5)如果找到,则返回这个session对象。
(6)如果找不到,可能直接返回null,或者再创建新的session对象。

结论: 通过JSESSIONID在服务器中查询对应的session对象。

Session细节

1.setMaxInactiveInterval(秒数): 设置session对象的有效时间
注意:不是浏览器关闭,session对象就销毁。
默认情况: 等待30分钟空闲时间,session对象才会销毁。
session.setMaxInactiveInterval(20);


	<session-config>
		<session-timeout>1session-timeout>
	session-config>

2.可以让JSESSIONID不会随着浏览器关闭而丢失

/**
* 设置JSESSIONID的时间,不会随着浏览器关闭而丢失。
*/
		Cookie c = new Cookie("JSESSIONID",session.getId());
		c.setMaxAge(1*30*24*60*60);//1个月
		response.addCookie(c);

3.直接手动销毁sessino对象
invalidate();
4.创建或得到session对象
request.getSession() / request.getSession(true)
创建或得到session对象。查询session对象,如果没有sessino对象,则创建新的session对象。

//创建或得到session对象
		HttpSession session = 
				request.getSession(true);

request.getSession(false)
得到session对象。查询session对象,如果没有session对象,直接返回null。

	//得到session对象
		HttpSession session = 
					request.getSession(false);
		
		if(session==null){
     
			System.out.println("没有session对象");
		}else{
     
			//获取会话数据
			String name = 
					(String)session.getAttribute("name");
			System.out.println("name="+name);
		}

总结:
会话管理: 浏览器与服务器之间会话过程中产生的会话数据

Cookie技术:会话数据保存在浏览器
核心的API:
(1)创建Cookie对象
Cookie c = new Cookie(“name”,“value”)
(2)发送给浏览器
respone.addCookie©;
(3)浏览器发送cookie给服务器,服务器接收cookie
Cookie[] cookies = request.getCookies()

Session技术: 会话数据保存在服务器(内存中)
核心API:
(1)创建或得到HttpSession对象
HttpSession session = request.getSession(true) 创建或得到
HttpSession session = request.getSession(false) 得到
(2)使用HttpSession保存和获取,删除会话数据
session.setAttribure(“name”,Object);
session.getAttribute(“name”);
session.removeAttrbute(“name”);

你可能感兴趣的:(学习经验,session,java,cookie,servlet)