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>