javaWeb---Session

一、什么是HttpSesssion
javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!不是http协议定义的。
HttpSession概述
* HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端对象,保存在服务器端!!!
* HttpSession是Servlet三大域对象之一(request、session、application(ServletContext)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法
* HttpSession底层依赖Cookie,或是URL重写!

  • session的实现原理
    session底层是依赖Cookie的!我们来理解一下session的原理吧!
    当我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。
    当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!
    当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。
    当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。

HttpSession原理(理解)
* request.getSession()方法:
获取Cookie中的JSESSIONID:
<> 如果sessionId不存在,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
<> 如果sessionId存在,通过sessionId查找session对象,如果没有查找到,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
<> 如果sessionId存在,通过sessionId查找到了session对象,那么就不会再创建session对象了。
<> 返回session

如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。
下次请求时,再次执行request.getSession()方法时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使用的是同一session对象。

  • 服务器不会马上给你创建session,在第一次获取session时,才会创建!request.getSession();

  • request.getSession(false)、request.getSession(true)、request.getSession(),后两个方法效果相同,

    第一个方法:如果session缓存中(如果cookie不存在),不存在session,那么返回null,而不会创建session对象。

二、HttpSession的作用
* 会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束!
会话:一个用户对服务器的多次连贯性请求!所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器!
* 服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,它们被服务器保存到一个Map中,这个Map被称之为session缓存!
Servlet中得到session对象:HttpSession session = request.getSession();
Jsp中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用!
* session域相关方法:

void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);

使用session保存登录信息以及cookie保存信息
login.jsp

<body>
  <%
  //一定对于cookie要先进行非空判断
  String uname="";
  String upw ="";
  Cookie[] cookies = request.getCookies();
  if(cookies != null){
      for(Cookie c : cookies){
          if("uname".equals(c.getName())){
              uname = c.getValue();
          }
          if("upw".equals(c.getName())){
              upw = c.getValue();
          }
      }
  }
  %>
  <%
  //先定义为空,不然会在顶部显示null字符
  String message = "";
  String mesg =(String)request.getAttribute("mesg");
  if(mesg!=null){
      message = mesg;
  }
  %>
  <h1>
  登录
  </h1>
  <font color="red"><%=message %></font>
    <form action = "/jspSessionCookie/LoginServlet" method="post">
    姓名:<input type="text" name="username" value=<%=uname %>><br>
    密码:<input type="text" name="password" value=<%=upw %>><br>
    <input type="submit" name="submit">
    </form>
  </body>

/LoginServlet

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

        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if(username.equals("admin")&&password.equals("123456")){
            Cookie cookies1 = new Cookie("uname", username);
            Cookie cookies2 = new Cookie("upw", password);
            cookies1.setMaxAge(60*60*24);
            response.addCookie(cookies1);
            cookies2.setMaxAge(60*60*24);
            response.addCookie(cookies2);

            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            session.setAttribute("password", password);
            response.sendRedirect("/jspSessionCookie/login/succ1.jsp");


        }else{
            request.setAttribute("mesg", "用户名或者密码错误");
            request.getRequestDispatcher("/login/login.jsp").forward(request, response);

        }


    }

succ1.jsp

<body>
  <h1>succ1</h1>
  <%
  String username = (String)session.getAttribute("username");
  if(username==null){
      request.setAttribute("mesg", "不要冒充我最重要的人");
      request.getRequestDispatcher("/login/login.jsp").forward(request, response);
      return;
  }
  %>

  <h1>欢迎<%=username %>到来</h1>
    <h1>很开心你终于来了<br>在我差一点放弃的时刻</h1>
  </body>

猜你喜欢

转载自blog.csdn.net/ilikejj0/article/details/80169174