首页 > 技术文章 > HttpSession

xjs1874704478 2019-05-11 09:41 原文

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>

 

 

 

推荐阅读