1、Session的获取
(1)无参的方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(); System.out.println(httpSession.getId()); }
请求中无Cookie,但是响应中存在Cookie:
当再次访问该Servlet的时候,请求中存在Cookie,响应中的Cookie已经没有了:
以上为无参的方法获取Session,如果没有Session则创建一个,如果有则直接返回。
(2)有参的方法:
参数为false:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(false); System.out.println(httpSession.getId()); }
如果有Session则直接返回。
没有的话返回500错误:
参数为true:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(true); System.out.println(httpSession.getId()); }
此方法与不加参数等效。
2、Session的有效期限:
前三次访问是连续访问三次CookieServlet,可以看出,SESSIONID的值是不会发生变化的,但是当关闭了浏览器,第四次访问CookieServlet时,SESSIONID发生了变化;第五次为更换了浏览器之后的结果,SESSIOID依旧会发生变化。
以下情况下Session需要重新建立:
(1)用户关闭了浏览器。但是关闭了浏览器并不代表Seesion已经被销毁了,因为Session保存在服务器内部。
(2)关闭了服务器。
(3)用户没有向服务器提出请求(超过30分钟),过期后服务器自动删除,从不操作服务端资源开始计时。
可以修改(直接修改或在自己的web.xml中配置,将默认的时间覆盖掉)。
3、Session的设置:
(1)时间:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(true); httpSession.setMaxInactiveInterval(10);//十秒后失效 System.out.println(httpSession.getId()); }
第一次访问,成功返回SESSIONID。
过十几秒钟后重新访问发现SESSIONID的值已经改变了:
这是因为第一个SESSIOID已经过期了,需要创建第二个。
(2)强制失效(手动销毁):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(true); httpSession.invalidate(); System.out.println(httpSession.getId()); }
即执行invalidate()后可以将创建的SESSION立即结束。
4、session的特点:
(1)存储在服务器端。
(2)依赖于Cookie,借助Cookie存储JSESSIONID。
(3)存在有效期限。
5、session的数据共享
要体现出Session的数据共享,需要建立两个Servlet:
第一个:建立Session,将值设置为Tom。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String name="Tom"; HttpSession httpSession=request.getSession(true); httpSession.setAttribute("name",name); System.out.println(httpSession.getId()); }
第二个获取Session:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession httpSession=request.getSession(); System.out.println(httpSession.getAttribute("name")); }
也就是说对于不同的请求,都可以共享Session中的数据,他们的请求针对的是同一个Session,但是要保证Session没有失效。即没有关闭浏览器,没有过期,Session中的数据存储在服务器。
6、session的应用
(1)使用Cookie实现的登录的不足:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式 Cookie[] cookies=request.getCookies(); Connection con=null; login log= null; int successNum=0; try { con= C3p0Utils.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "Select * from login"; List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class))); if(cookies!=null) {//验证数据库中是否有与Cookie对应的用户 for (int i = 0; i < list.size(); i++) { log= list.get(i); for (Cookie cookie : cookies) { if((log.getAccount().equals(cookie.getName()))&&(log.getPassword().equals(cookie.getValue()))){ successNum++; } } } if(successNum>=1){ response.getWriter().write("Successful login with Cookie!"); } else{ request.getRequestDispatcher("page").forward(request,response); } } else{ request.getRequestDispatcher("page").forward(request,response);//请求转发 } } catch (SQLException e) { throw new RuntimeException(e); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
response.getWriter().write("<html>"); response.getWriter().write("<head>"); response.getWriter().write("<title>"); response.getWriter().write("Login"); response.getWriter().write("</title>"); response.getWriter().write("</head>"); response.getWriter().write("<body bgcolor=\"aqua\">"); response.getWriter().write("<center>"); response.getWriter().write("<h3>"); response.getWriter().write("欢迎你"+request.getParameter("account")); response.getWriter().write("</h3>"); response.getWriter().write("</center>"); response.getWriter().write("</body>"); }
使用Cookie虽然实现了三天免登录的基础功能,但是,如果在用Cookie登录成功后需要重定向(两次请求,request对象不能携带数据)到另外一个Cookie时,request获取的值在重定向的Servlet中已经不再起作用了,访问的结果只能是空值。
(2)使用Session的请求共享功能,实现在不同的Servlet跳转过程中依旧能够通过request获得用户信息。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式 Cookie[] cookies=request.getCookies(); Connection con=null; login log= null; int successNum=0; try { con= C3p0Utils.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "Select * from login"; List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class))); if(cookies!=null) {//验证数据库中是否有与Cookie对应的用户 for (int i = 0; i < list.size(); i++) { log= list.get(i); for (Cookie cookie : cookies) { if((log.getAccount().equals(cookie.getName()))&&(log.getPassword().equals(cookie.getValue()))){ HttpSession httpSession=request.getSession(); httpSession.setAttribute("login",log); successNum++; } } } if(successNum>=1){ response.sendRedirect("/Servlet_login_war_exploded/main");//重定向 } else{ request.getRequestDispatcher("page").forward(request,response); } } else{ request.getRequestDispatcher("page").forward(request,response);//请求转发 } } catch (SQLException e) { throw new RuntimeException(e); } }
在通过Cookie登录成功后,创建了Session,对Session进行了赋值,而在重定向到MainServlet后,可以从Session中获取值。虽然在不同的Servlet中,是不同的请求,但是依旧能够通过Session获取值。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
login log= (login) request.getSession().getAttribute("login"); response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式 response.getWriter().write("<html>"); response.getWriter().write("<head>"); response.getWriter().write("<title>"); response.getWriter().write("Login"); response.getWriter().write("</title>"); response.getWriter().write("</head>"); response.getWriter().write("<body bgcolor=\"aqua\">"); response.getWriter().write("<center>"); response.getWriter().write("<h3>"); response.getWriter().write("欢迎你"+log.getAccount()); response.getWriter().write("</h3>"); response.getWriter().write("</center>"); response.getWriter().write("</body>"); }