什么是session ?
也叫会话对象,是存储在服务器端用来识别用户的时域,用来记住用户的访问信息,这样用户下次访问时就能识别。
怎么使用session ?
通过HttpServletRequest对象获取
public class SessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter pw = resp.getWriter(); // 从请求对象中获取session,如果没有则创建session HttpSession isession = req.getSession(); } }
作用
1.识别用户
2.存储信息
1.识别用户:
服务器创建session,产生sessionID,当用户访问时sessionID会保存在客户端cookie中
用户下次访问时就会带着sessionID,服务器就会找到对应的session,这样就可以识别用户了。
2.存储信息:
session也是域对象可以存储一些信息,交给服务器处理。
方法:
//从请求对象中获取session,如果没有则创建session HttpSession isession = req.getSession(); isession.setAttribute("username", "zhangsan"); isession.setAttribute("password", "123"); isession.setMaxInactiveInterval(60);//设置超时时间
例题
编写一个Servlet使用Session如下功能
- 当用户第一次访问时,显示:你好,游客。
- 提供一个文本框和按钮 让用户填用户 登录,登录也是提交到给本Servlet处理,登录后 页面显示 你好,xxxx.
- (不关闭浏览器)1分钟内刷新页面,显示 你好,xxxx.
- (不关闭浏览器)1分钟后刷新页面,显示:你好,游客。
package session_test; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/session") public class SessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter pw = resp.getWriter(); // 从请求对象中获取session,如果没有则创建session HttpSession isession = req.getSession(); // 获取用户提交的数据 String name = req.getParameter("username"); String password = req.getParameter("password"); pw.println("<!DOCTYPE html> "); pw.println("<html> "); pw.println("<head> "); pw.println("<meta charset=\"UTF-8\"> "); pw.println("<title>Insert title here</title> "); pw.println("</head> "); pw.println("<body> "); pw.println("<form action=\"session\" method=\"get\"> "); pw.println("用户名:<input type=\"text\" name=\"username\" /><br /> "); pw.println("密码:<input type=\"password\" name=\"password\" /><br /> "); pw.println("<br /><input type=\"submit\" value=\"登录\" /> "); pw.println("</form> "); pw.println(" "); //判断session是不是新创建的 if (isession.isNew()) { pw.println("你好,游客"); } else { //服务器已存在该session //把用户输入放入session,用来比对用户下次输入信息 //判断session中是否已经有内容,如果有就不在存入,这样只能使用第一次记录的账号密码登陆,没有使用数据库 if(isession.getAttribute("username")==null&&isession.getAttribute("password")==null) { System.out.println("存入账号密码"); isession.setAttribute("username", name); isession.setAttribute("password", password); isession.setMaxInactiveInterval(60); }else { System.out.println("namegetAttribute"+isession.getAttribute("username")); System.out.println("namegetValue"+isession.getValue("username")); } //获取session中的账号和密码 String cusername = (String) isession.getAttribute("username"); String cpassword = (String) isession.getAttribute("password"); System.out.println("获取session中的账号和密码"); System.out.println(cusername); System.out.println(cpassword); System.out.println(isession.getId()); if(name.equals(cusername)&&password.equals(cpassword)) { pw.println("你好,"+cusername); } } pw.println("</body> "); pw.println("</html> "); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
运行结果
用户第一次访问:
cookie存储了sessionID:
输入账号密码再次登录
sessionID在超时时间内不会改变
用户输入其他账号密码,不能登录,因为session里已经有了账号和密码(“zhangsan”,“123”)
注意
session对象的getAttribute(“字段”)和getValue(“字段”)作用相同都是获取字段的值。getValue(“字段”)已经过时了,所以不建议使用。
生命周期
- 创建:第一次执行request.getSession()时创建
- 销毁:
- 服务器(非正常)关闭时
- session过期/失效(默认30分钟)
设置时间:
代码设置
session.setMaxInactiveInterval(60);
问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时
可以在工程的web.xml中进行配置
<session-config> <session-timeout>30</session-timeout> </session-config>
- 手动销毁session
session.invalidate();
服务器关闭
作用范围:
默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象
Session技术
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID