重温Servlet学习笔记--session对象
session的类型是属于HttpSession,HttpSession是由javaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端.
- HttpSession是servlet三大域对象之一,其他两个是request和application(servletContext),所以它也有setAttribute(),getAttribute(),等方法.
- HttpSession的会话范围是某用户从首次访问服务器开始,到该用户关闭浏览器结束,session对象会存活在这中间的整个过程, 服务器会为每个客户端创建一个session对象,session就好像是客户在服务器端的账户,他被服务器保存在一个Map里,这个Map被称为session缓存.
-
session的实现原理
session底层是依赖Cookie的!我们来理解一下session的原理吧!
当我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!
当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
下面写一个简单的案例,加深一下对session和cookie的理解,我们要实现一个简单的登录功能,登录成功时会将用户名保存到一个session中,同时也保存到一个cookie中,然后会跳转到成功页面,但用户直接输入url访问成功页面时,需要验证用户是否已登录(用session),如果没有登陆则跳转回登录页面,当浏览器关闭再打开访问登录页面时,自动显示上一次的访问登录用户名(用cookie):
新建一个jsp,命名为login.jsp(head标签内容已省略):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <% String username=""; Cookie[] cookie=request.getCookies(); if(cookie!=null){ for(Cookie c:cookie){ if("username".equals(c.getName())){ username=c.getValue(); } } } %> <form action="<c:url value='/LoginServlet'/>" method="post"> <label style="font-color:red;">${errorLogin }</label><br> 用户名:<input type="text" name="username" value="<%=username%>"/><br> 密码:<input type="password" name="password"/><br> <input type="submit" value="登录"/> </form> </body> </html>
新建一个servlet,命名为LoginServlet,用来处理登录逻辑,并完整各个功能(只提供关键代码):
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); String username=request.getParameter("username"); String password=request.getParameter("password"); if(username.equals("wang")&&password.equals("123")){ HttpSession session = request.getSession(); session.setAttribute("username", username); session.setAttribute("password", password); Cookie cookie=new Cookie("username",username); cookie.setMaxAge(60*60*24*7); response.addCookie(cookie); response.sendRedirect("/test/sessionDemo1/succ1.jsp"); }else{ request.setAttribute("errorLogin", "用户名或密码错误"); request.getRequestDispatcher("/sessionDemo1/login.jsp").forward(request, response); } }
最后新建一个登陆成功时的jsp页面,命名为succ1.jsp(只提供body部分代码):
<body> <% String username=(String)session.getAttribute("username"); String password=(String)session.getAttribute("password"); if(username==null){ request.setAttribute("errorLogin", "您还没有登录,请先登录"); request.getRequestDispatcher("/sessionDemo1/login.jsp").forward(request, response); return; } %> 登陆成功,你好${username } </body>
- HttpSession的其他方法:
- String getId():获取sessionId
- int getMaxInactiveInterval();获取session的最大不活动时间,默认为30分钟,如果session在30分钟内没有被使用,Tomcat就会在session池中移除这个session对象
- void invalidate();让session失效,用户退出登录时,可以调用该方法
- web.xml中配置session的最大不活动时间:
<session-config> <session-timeout>20</session-timeout> </session-config>
session最常用的东西就是作为域对象,传递参数,也是最重要的,其他的知识点在某些地方也很重要,要好好理解.