会话

111 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

会话

从用户打开浏览器,访问各个web资源开始,到用户关闭浏览器结束,叫做一个会话。

用户在使用浏览器与服务器进行会话的过程中所产生的数据,程序会将其保存(账号密码等),叫做cookie缓存。

会话方式:

  • 客户端会话技术:Cookie----把信息保存在客户端
  • 服务器端会话技术:Session----把信息保存在服务器端

Cookie

服务器将Cookie写给客户端

实现原理

基于响应头set-cookie和请求头cookie实现

实现步骤
  1. 创建Cookie对象(src/cookie/),绑定数据:new Cookie(String name, String value);
  2. 发送Cookie对象:response.addCookie(Cookie cookie);
  3. 获取Cookie,拿到数据
  4. 删除Cookie
public class CookieServlet extends HttpServlet{
	@Override
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException{
		//创建Cookie 如果没有设置时间的话,关闭浏览器,cookie就被删除
		Cookie cookie = new Cookie("name","value");
        //在响应之前,设置Cookie存储时间,单位为秒,若要删除cookie信息,将时间设置为0即可
        cookie.setMaxAge(60*3)
		//发送Cookie
		//把Cookie信息写到客户端
		response.addCookie(cookie);
		/* 如果想要覆盖name,则再定义一个同是name的cookie对象即可:
		Cookie cookie2 = new Cookie("name","value2");
		response.addCookie(cookie2);*/
       
        //等下一次访问时,就会自动加上Cookie
        
        //获取Cookie数组,通过遍历获取所需的cookie
        Cookie[] cookies = request.getCookies();
        for(Cookie c : cookies){
            System.out.println("name:" + c.getName());
            System.out.println("value" + c.getValue());
        }
	}
}

**注意:**在tomcat 8之前 cookie中不能直接存储中文数据,在tomcat 8之后,cookie支持中文数据,但特殊字符还是不支持,建议使用URL编码存储,URL编码解析。且注意cookie中不能存在空格。

Cookie cookie3 = new Cookie("name", URLEncoder.encode("这里是value","utf-8"));
System.out.println("name :" + URLDecoder.decode(c.getValue(),"utf-8"));

设置cookie的携带路径

默认情况下会在访问创建cookie的web资源相同的路径都携带cookie信息(比如都在src目录下)

同一工程下设置携带路径:

  • cookie.setPath("/CookiePro/cookieServlet");//只有访问cookieServlet才携带cookie信息(常用)
  • cookie.setPath("/CookiePro");//访问指定的工程时,都会携带cookie信息
  • cookie.setPath("/");//访问服务器下部署的所有工程时都会携带cookie

不同工程下设置携带路径:

  • setDomain(String path);//如果一级域名相同,那么多个服务器之间cookie可以共享
  • setDomain(".baidu.com");//那么tieba.baidu.com和news.baidu,com中cookie可以共享

疑问

每次访问更新时间后不会将此前cookie覆盖导致获取的cookie是最新时间吗?

**回答:**存过后第二次访问才能取

Session

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

Session需要借助于Cookie存储客户的唯一性标识SESSIONID

Session在一个Servlet当中存数据,在另一个Servlet当中取数据,其原理是:

  • 每一个会话访问服务器时,会给该用户分配他自己对应的存储空间
  • 并为创建的存储空间标一个编号:SessionID
  • 第一次访问时,会把对应的sessionID以Cookie的形式写给浏览器
  • 下次再访问时,会携带sessionID,找到当初创建的那个存储空间
  • 最后在对应的存储空间当中取出数据

获取Session对象

//获取当前会话的Session对象
//如果服务器没有该会话的Session对象,会创建一个新的Session返回
//本质上是根据SESSIONID判断客户端是否在服务器上已经存在session
HttpSession session = request.getSession();

session.setAttribute("sessionName", "sessionValue");
//在所有的Servlet都可以拿到session获取数据

//另一个Servlet下↓
HttpSession session = request.getSession();
session.getID();//获取SESSIONID的方法
Object obj = session.getAttribute("sessionName");//获取SESSION中sessionName键对应的的值

/**
*request域对象
*共享数据
*一次请求当中,请求转发过程当中可以共享数据
*session:域对象
*所有的Servlet都可以共享数据
*第二次访问:
*先去从Cookie中获取JSESSIONID
*如果有值,就直接把对应的Session对象拿来使用
*如果没有值,就创建一个新值,并且会把JSESSIONID写到Cookie
**/

Session的生命周期与使用场景

**创建:**第一次执行request.getSession()时创建

销毁:

  1. 服务器关闭时
  2. session过期/失效(从最后一次操作结束时起,默认三十分钟)
  3. 手动销毁----session.invadate
  4. 浏览器被关闭,session就销毁这句话是不完全正确的

**作用范围:**默认在一次会话中,任何资源共用一个session对象

使用场景:

登陆成功后,把用户信息写到Session中,在另外一个页面当中会判断session中有没有存储用户信息,如果有,就可以访问,没有session,就重新登陆。

在程序内部办到数据的共享

session的特点

  1. session用于存储一次会话的多次请求的数据,存在服务器端
  2. session可以存储任意类型,任意大小的数据

session与cookie的区别

  1. session存储数据在服务器端,cookie在客户端
  2. session没有数据大小限制,cookie有
  3. session数据安全,cookie相对不安全