zoukankan      html  css  js  c++  java
  • 12 servlet——session对象

    session对象

    session对象使用来在同一个用户的不同请求之间传递信息的。每个网站都会为每个用户在登录后创建一个session对象。

    原理

    用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用cookie技术存储到浏览器中,保证用户的其它请求能够获取到同一个session对象,也保证了不同请求能获取到共享的数据。

    特点

    • 在服务端创建
    • 存储在服务端
    • 依赖cookie技术
    • 一次会话(session的生命周期  )

    作用域

    • 一次会话
    • 在JESSIONID和session对象不时效的情况下,整个项目内。

    使用

    创建session对象/获取session对象(都用同一句代码)

    HttpSession hs = req.getSession();

    •   如果请求中有session的标识符也就是JSESSIONID,则返回对应的session队形
    •   如果请求中没有session的表示符也就是JESESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储在浏览器(如下图1)
    •   如果session对象失效了,也会重新创建一个session对象,并将JSESSIONID存储在浏览器内存中

    获取JSESSIONID

    hs.getId();

    设置Session时间

      hs.setMaxInactiveInterval(int seconds);

      注意:在指定时间(默认30min)内session对象没有被使用,则销毁。如果使用了则重新计时。

    修改默认session生命周期

    在项目的web.xml内(也可以是tomcat下的web.xml,那对所有的项目生效,优先级低),添加如下代码(单位:秒):

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

      

    强制失效

    hs.invalidate();

    使用session存取数据

    • 存储:hs.setAttribute(String name ,Object obj);
    • 获取:hs.getAttribute(String name);//返回类型为object
    • 注意:存储的动作和取出的动作发生在不同的请求中,存储要先于取出

    注意:JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效。

    小案例1

    为了验证session可以在同一用户的不同请求中传递信息,我们来做这样一个小案例:SessionServlet创建session,然后看看Session2Servlet能不能拿到SessionServlet设置的session的JSESSIONID。

    SessionServlet

    package com.xiaohei.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class SessionServlet extends HttpServlet {
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//设置请求编码格式
    		req.setCharacterEncoding("utf-8");
    		//设置响应编码格式
    		resp.setContentType("text/html;charset=utf-8");
    		//获取请求信息
    			String anme = "张三";//假设我们获取到
    		//处理请求
    			//创建session对象
    			HttpSession hs = req.getSession();//即是创建也是获取,取决于请求里面有没有session的id
    			System.out.println(hs.getId());
                  //设置时间
          
                  hs.setMaxInactiveInterval(30*60);//单位:秒
    //		响应
    			//直接响应
    			resp.getWriter().write("session学习");
    	}
    }
    

      

    Session2Servlet

    public class Session2Servlet extends HttpServlet {
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("session2Servlet"+req.getSession());
    	}
    }
    

      

    运行SessionServlet

    可以看到首次运行设置了一个cookie:JSESSIONID=xxxxx;

    运行Session2Servlet

    可以看到在请求中携带的cookie:JSESSIONID与上面一致,说明了他们访问的是同一个session对象。

    小案例2

    请看下一篇文章

  • 相关阅读:
    互联网与局域网(四)
    Socket介绍(五)
    HttpClient(七)
    TCP协议与HTTP协议区别
    TCP连接的三次握手
    context-param和init-param区别
    【HPU】[1736]老王修马路(二)
    【HPU】[1735]老王修马路(一)
    【HPU】[1734]老王修公园
    【HPU】[1733]神奇的数字9
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12355595.html
Copyright © 2011-2022 走看看