状态管理---session

session (会话)

(1)什么是session?
- 服务器端为了保存用户状态而创建的一个特殊的对象

(2)session工作原理
- 当浏览器访问服务器的时候,服务器创建`session`对象(该对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId以Cookie的set-Cookie方式发送给浏览器.当浏览器再次访问服务器的时候会将sessionId发送过来,服务器可以使用该sessionId,依据该sessionId找到对应的session对象
    
(3)如何获得session对象
- 方式一

 HttpSession session = request.getSession(Boolean flag);

 说明:
            HttpSession是一个接口,session对象是一个符合该接口的对象.
        (1)当flag == true时
            先查看请求当中有没有sessionId,如果没有则创建一个session对象;如果有sessionId,则依据该sessionId查找对应的sessionId对象,如果找到了,则返回该session,如果找不到,则创建这个session对象并返回.




        详细细节:
        


        (2)当flag == false时
            先查看请求当中有没有sessionId,如果没有,返回null,如果有sessionId,则依据该sessionId查找session对象,如果找到了,则返回session对象,如果找不到则返回null.

- 方式二

 HttpSession session = request.getSession();//等价于request.getSession(true);

(4)session常用方法
- 绑定数据的方法

    setAttribute(String name , Object obj);
    getAttribute(String name);//依据绑定名查找数据,如果找不到返回null
    removeAttribute(String name);//删除
    String getId();//获取sessionId

 (5)session超时
- 服务器会将空闲时间过长的session对象删除掉

    注:一般服务器缺省的超时时间长度一般是30分钟

- 超时时间修改
    - 1: 修改web.xml文件中的配置(servers-->web.xml)

<session-config>
       <session-timeout>30</session-timeout>
</session-config>
        

 也可将该段代码添加到当前应用的web.xml中



    - 2: session.setMaxInactiveInterval(int interval);//设置最大时间间隔s

            两次请求之间的最大间隔不能超过这个时间

(6)删除session
- session.invalidate() 失效(删除)

(7)session验证(day07-lab)
- step1:在登录成功之后,绑定一些数据到session对象上.比如

  session.setAttribute("user",user);


- step2:当用户访问需要保护的资源时(只有登录成功之后次啊能访问的资源),比访问success.jsp,进行session验证.
 

Object user = session.getAttrite("user");
if(user == null ){
     //没有登录,重定向到登录页面
      response.sendRedirect("login.jsp");
}

(8)比较session和cookie - session相对于cookie,优点是更安全,能存放更多的数据,支持更丰富的数据类型,    但是session会u占用服务器端的内存空间,如果用户量更大,会占用大量的内存空间(cookie不占用服务端的资源),session需要服务器端同步.  路径问题 - 指的是链接,表单提交,重定向,和转发时,如何填写路径. - `<a href="">` - `<form action="">` - `response.sendRedirect("")` - `request.getRequestDispatcher("")` (1) 相对路径 - 不已"/"开头的路径就时相对路径 (2) 绝对路径 - 以"/"开头的路径就是绝对路径 (3) 如何写绝对路径 - 链接,表单提交,重定向:从应用名开始写 - 转发:从应用名之后开始写     注:一定不要将应用名写在路径里面,使用:`request.getContenxtPath()`获取实际部署时的应用名,该方法返回的应用名前面加了"/" IE禁用Cookie后的session处理 - 解决方案:URL重写     - response. encodeRedirectURL(java.lang.String url)          - 用于对sendRedirect方法后的url地址进行重写。     - response. encodeURL(java.lang.String url)         - 用于对表单action和超链接的url地址进行重写  - 附加:     - Session的失效  invalidate()立刻实效     - Web.xml文件配置session失效时间   Cookie和Session的区别 1、Cookie将会话中产生数据保存在客户端, 是客户端的技术 2、session将会话中产生的数据保存在服务器端, 是服务器端的技术 3、Cookie将会话中产生的数据保存在客户端, 容易随着用户的操作而丢失或者被窃取. 因此Cookie适合存储对安全性要求不高, 但是要求存储时间比较长的数据 4、session是将会话中产生的数据保存在服务器端, 虽然不容易随着用户的操作而丢失. 但是在服务器中会占用服务器的空间, 因此session适合存储要求时间不长, 但是要求安全性比较高的数据. 5、Cookie的应用场景: 比如: 在网页中显示上次访问时间、记住用户名、实现购物车 6、Session的应用场景:保存用户的登录状态、实现购物车