httpSession详解

------------------------------httpSession详解---------------------------------------

HttpSession概述

 

  • 会话跟踪之session

session也是域对象之一,它的范围是在一个会话范围内有效。session既然是域对象,那么当然就要有getAttribute()和setAttribute()系列方法了。

在一个会话内共享一个session对象,所以session中可以保存一个会话内的数据。例如当前用户的信息。

session的范围大于request,可以在一个会话中多个请求之间共享数据。但session的范围小于ServletContext(application),session不能在多个用户之间共享数据。

目前所学过的域对象的作用范围:

       ServletContext             >     HttpSession   >     HttpServletRequest

  •  获取session对象

使用request.getSession()方法就可以获取session对象。

有了session,就不用使用Cookie来跟踪会话了!但是session不能像Cookie那样长命,一旦用户关闭浏览器窗口,那么session就死掉了。

 

Session的存和取数据代码示例:

public class RegistServlet extends HttpServlet {

 

       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              request.setCharacterEncoding("UTF-8");

              //获取用户名和密码

              String username = request.getParameter("username");

              String password = request.getParameter("password");

             

              System.out.println("用户名:"+username);

              System.out.println("密码:"+password);

             

              //获得session对象

              HttpSession session = request.getSession();

              //添加session属性,在session中的属性在整次会话(浏览器不关闭)都有作用

              session.setAttribute("username", username);

              session.setAttribute("password", password);

              request.getRequestDispatcher("/regist1.html").forward(request, response);

       }

 

}

 

public class Regist1Servlet extends HttpServlet {

 

       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              //获得性别

              String gender = request.getParameter("gender");

              //获得职位

              String job = request.getParameter("job");

             

              //根据request获得session, 如果session已存在就直接使用当前会话的session,如果不存在就创建新的session对象

              HttpSession session = request.getSession();

              //从session中获得用户和密码,返回的是Object需要强转为String类型

              String username = (String)session.getAttribute("username");

              String password = (String) session.getAttribute("password");

              //获得session的id,session利用id和浏览器的cookie进行绑定用来区分会话

              String sessionID = session.getId();

              System.out.println(sessionID);

              switch(gender){

                     case "1" :

                            gender="男";

                            break;

                     case "2" :

                            gender="女";

                            break;

              }

             

              switch(job){

                     case "1" :

                            job="讲师";

                            break;

                     case "2" :

                            job="构架师";

                            break;

              }

              //设置response的类型和编码

              response.setCharacterEncoding("UTF-8");

              response.setContentType("text/html;charset=UTF-8");

              //打印到页面上

              response.getWriter().println("<h1>注册成功</h1>");

              response.getWriter().println("<hr>");

              response.getWriter().println("用户名:"+username+"<br>");

              response.getWriter().println("密码:"+password+"<br>");

              response.getWriter().println("性别:"+gender+"<br>");

              response.getWriter().println("职位:"+job+"<br>");

       }

}

session原理(依赖Cookie)

我们都知道HTTP是无状态协议,但是为什么session可以跟踪会话状态呢?没错,session依赖Cookie。

当客户端第一次访问服务器时,服务器会为客户端创建一个session对象,然后把session对象放到session池中,在响应时把sessionId通过Cookie响应给客户端。注意,只有在第一次访问时,服务器才会创建session,给客户端响应sessionId。从此以后就不会了!

当客户端再次访问服务器时,会在请求中带着sessionId给服务器,服务器通过sessionId到session池中找到session对象,这就可以完成会话跟踪了。也就是说,服务器端保存的是session对象,而客户端只有sessionId。每次访问都需要通过客户端的sessionId来匹配服务器端的session对象!这样用户在session中保存的数据就可以再次被使用了。

sessionId是服务器通过Cookie发送给客户端浏览器的,这个Cookie的maxAge为-1,即只在浏览器内存中存在。如果你关闭所有浏览器窗口,那么这个Cookie就会消失了!

 

session失效

session失效有如下几个原因:

  1. session.invalidate()方法注销session
  2. session超时

在项目中web.xml文件中添加session-config元素

<session-config>

  <!-- session的超时时间,以分钟为单位 -->

  <session-timeout>1</session-timeout>

  </session-config>

 

      3.Cookie被禁用

猜你喜欢

转载自blog.csdn.net/weixin_41547486/article/details/81294280