zoukankan      html  css  js  c++  java
  • HttpSession

    HttpSession(****重点****)

    1.HttpSession概述

      *HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端的对象,保存在服务器端!

      *HttpSession是Servlet三大域对象之一(request、session、application(ServletContext)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法

      *HttpSession底层依赖Cookie,或是URL重写!

    2.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);

    3.案例1:演示session中会话的多次请求中共享数据

      *AServlet:向session域中保存数据

      *BServlet:从session域中获取数据

      *演示:

        >第一个请求:访问AServlet

        >第二个请求:访问BServlet

    AServlet:

     1 public class AServlet extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         //得到session
     6         HttpSession session = request.getSession();
     7         session.setAttribute("name", "金泰妍");
     8         
     9     }
    10 }

    BServlet:

     1 public class BServlet extends HttpServlet {
     2     
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         
     6         //得到session
     7         HttpSession session = request.getSession();
     8         String name = (String) session.getAttribute("name");
     9         System.out.println(name);
    10     }
    11 }

    在浏览器依次请求http://localhost:8080/XJS_Session/AServlet 和 http://localhost:8080/XJS_Session/BServlet 

    然后会在控制台打印:

    金泰妍
    

      

     4.案例2:演示保存用户登录信息(精通)

      *案例相关页面和Servlet:

        >login.jsp:登录页面

        >succ1.jsp:只有登录成功才能访问的页面

        >succ2.jsp:只有登录成功才能访问的页面

        >LoginServlet:校验用户是否登录成功!

      *各页面和Servlet内容:

        >login.jsp:提供登录表单,提交表单请求LoginServlet

        >LoginServlet:获取请求参数,校验用户是否登录成功

          <>失败:保存错误信息到request域,转发到login.jsp(login.jsp显示request域中的错误信息)

          <>成功:保存用户信息到session域中,重定向到succ1.jsp页面,显示session域中的用户信息

        >succ1.jsp:从session域中获取用户信息,如果不存在,显示“您还没有登录”。存在则显示用户信息

        >succ2.jsp:从session域中获取用户信息,如果不存在,显示“您还没有登录”。存在则显示用户信息

      只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就一起存在!那么用户访问succ1和succ2就会通过!

    login.jsp:

     1   <body>
     2     <h1>登录</h1>
     3     <%
     4         String uname="";
     5         //读名为username的cookie
     6         Cookie[] cookies=request.getCookies();
     7         if(cookies!=null){
     8             for(Cookie c:cookies){
     9                 //如果为空显示:""
    10                 //如果不为显示:Cookie值
    11                 if("username".equals(c.getName())){
    12                     uname=c.getValue();
    13                 }
    14             }
    15         }
    16      %>
    17     
    18     <%
    19         String message="";//一个空字符串
    20         String msg=(String)request.getAttribute("msg");//获取错误信息
    21         if(msg!=null){
    22             message=msg;
    23         }
    24      %>
    25     <font color="red"><b><%=message %></b></font>
    26     <form action="/XJS_Session/LoginServlet" method="post">
    27         用户名:<input type="text" name="username" value="<%=uname %>">
    28         密   码:<input type="password" name="password">
    29         <input type="submit" value="提交">
    30     </form>
    31   </body>

     LoginServlet:

     1 public class LoginServlet extends HttpServlet {
     2 
     3     public void doPost(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5             request.setCharacterEncoding("utf-8");
     6             String username = request.getParameter("username");
     7             String password = request.getParameter("password");
     8             System.out.println("username:"+username+", password:"+password);
     9             if(username!="" && password!=""){
    10                 if("xjs".equals(username) && "0309".equals(password)){
    11                     //设置Cookie
    12                     response.setContentType("text/html;charset=utf-8");
    13                     Cookie cookie=new Cookie("username",username);
    14                     cookie.setMaxAge(60*60);
    15                     response.addCookie(cookie);//把它显示到用户名文本框中
    16                     
    17                     
    18                     //登录成功
    19                     HttpSession session=request.getSession();
    20                     session.setAttribute("username", username);
    21                     session.setAttribute("password", password);
    22                     //重定向到succ1.jsp
    23                     response.sendRedirect("/XJS_Session/succ1.jsp");
    24                 }
    25                     else{
    26                     System.out.println("username:"+username+", password:"+password);
    27                     //输入的用户名和密码不存在
    28                     request.setAttribute("msg", "用户名和密码不存在!!!");
    29                     //用转发
    30                     RequestDispatcher rd=request.getRequestDispatcher("/login.jsp");
    31                     rd.forward(request, response);
    32                 }
    33             }else{
    34                 request.setAttribute("msg", "用户名或密码不能为空!!!");
    35                 //用转发
    36                 RequestDispatcher rd=request.getRequestDispatcher("/login.jsp");
    37                 rd.forward(request, response);
    38             }
    39     }
    40 }

    succ1.jsp:

     1   <body>
     2    <%
     3            if(session.getAttribute("username")==null&&session.getAttribute("password")==null){
     4                //重定向到login.jsp
     5                response.sendRedirect("/XJS_Session/login.jsp");
     6                return;//别的就不执行了
     7            }
     8     %>
     9     <%
    10         String username=(String)session.getAttribute("username");
    11         String password=(String)session.getAttribute("password");
    12         out.print("用户名:"+username);
    13         out.print("密码:"+password);
    14         
    15      %>
    16   </body>

    succ2.jsp:

     1   <body>
     2    <%
     3            if(session.getAttribute("username")==null&&session.getAttribute("password")==null){
     4                //重定向到login.jsp
     5                response.sendRedirect("/XJS_Session/login.jsp");
     6                return;//别的就不执行了
     7            }
     8     %>
     9     <%
    10         String username=(String)session.getAttribute("username");
    11         String password=(String)session.getAttribute("password");
    12         out.print("用户名:"+username);
    13         out.print("密码:"+password);
    14         
    15      %>
    16   </body>

    1.当用户在登录界面输入xjs和0309,就可以成功登录!

    2.如果直接访问succ1.jsp的话,会被重定向到login.jsp

    3.如果登录成功的话,会在服务器端保存用户信息到session域;也会向客户端保存cookie,下次登录的时候,用户名直接填写在用户名的输入框中!

    *****注意:用户名中不能输入中文,有待完善...


     5.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存在,如果关闭浏览器,则该Cookie马上销毁。

        >下次请求时,再次执行request.getSession()方法时,因为可以通过Cookie中的这个sessionId找到session对象,所以与上一次请求使用的是同一session对象。(在浏览器不关闭的情况下再次请求

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

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

        >第一个方法:如果session缓存中(如果Cookie不存在),不存在session,那么返回null,而不会创建session对象。一般不用这个方法,考点!

     

     ************注意:

    比如只是简单的访问Servlet,没有使用request.getSession()方法,服务器是不会创建session对象的,也没有sessionId对应的Cookie;(第一次访问)如果在Servlet中使用了request.getSession()方法或者访问了jsp页面,在客户端浏览器中的响应头中会有一个JSESSIONID的Cookie;(非第一次访问)会在请求头中带上这个JSESSIONID!!

    6.HttpSession其他方法:

      *String getId():获取sessionId;

        >sessionId的值,就是uuid生成的一个32位16进制的不重复的数;

     1 //一个生成32位16进制的字符串的类
     2 public class UUIDTest {
     3 
     4     @Test
     5     public void fun1(){
     6         //java.util包下的类
     7         UUID uuid = UUID.randomUUID();
     8         String str=uuid.toString();//61f65a38-7201-4c62-9925-e8f75a1b41f5
     9         str=str.replace("-", "");//把字符串中的-替换成""
    10         System.out.println(str.toUpperCase());//把小写变大写
    11     }
    12 }

      *int  getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟,当session对象在30分钟内没有使用,那么Tomcat会在session池中移除这个session;

      *void  invalidate():让session失效!调用这个方法会让session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的sessionId。-----有些网站上有退出按钮,让session失效,让退出后重新登录!

       *boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。

         >request.getSession().isNew();//可以判断是在为你创建session还是返回session!

     7.web.xml中配置session的最大不活动时间 

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

    8.URL重写(理解)

      就是把所有页面中的路径,都使用response.encodeURL("...');处理一下!

      *session依赖Cookie,目的就是让客户端发出请求时归还sessionId,这样才能找到对应的session

      *如果客户端禁用了Cookie,那么就无法得到sessionId,那么session也就无用了!

      *也可以使用URL重写来替代Cookie

        >让网站的所以超链接、表单中都添加一个特殊的请求参数,即sessionId

        >这样服务器可以通过获取请求参数的到sessionId,从而找到session对象。

      *response.encodeURL(String  url);

        >该方法会对url进行智能的重写:当请求中没有归还sessionId这个cookie,那么该方法会重写url,否则不重写!当然url必须是指向本站的url。

    ============================================================

    浏览器禁用Cookie的话,才会用到URL携带参数JSESSIONID

    在页面中使用:

     1   <body>
     2       <!-- 手动添加JSESSIONID参数 -->
     3     <a href="/XJS_Session/AServlet;JSESSIONID=<%=session.getId() %>">点击这里</a>
     4     <a href="/XJS_Session/AServlet;JSESSIONID=<%=session.getId() %>">点击这里</a>
     5     <a href="/XJS_Session/AServlet;JSESSIONID=<%=session.getId() %>">点击这里</a>
     6     
     7     <%
     8         //它会查看cookie是否存在,如果不存在,在指定的url后添加JSESSIONID参数
     9         //如果cookie存在,它就不会在url后添加任何东西!
    10         out.print(response.encodeURL("/XJS_Session/AServlet"));
    11      %>
    12   </body>

     

  • 相关阅读:
    OpenStack IceHouse版cinder模块新添加功能
    最小代价生成树
    HDU 3065 病毒侵袭持续中(AC自己主动机)
    POJ--2284--That Nice Euler Circuit【平面图欧拉公式】
    java工具类(四)之实现日期随意跳转
    Metasploit学习笔记之——情报搜集
    POJ 2378 Tree Cutting 子树统计
    cocos2d-x 3.0 touch事件官方解释
    html_entity_decode() 将 HTML 实体转成字符原型
    微信公众平台开发(81) 2014新年微信贺卡
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/10845335.html
Copyright © 2011-2022 走看看