本文共 6274 字,大约阅读时间需要 20 分钟。
生活中人与人进行谈话,就是一次会话,会话的内容我们会自己记住。而客户端与服务器端的交互也是会话,会话的内容好像也能被客户端和服务器端记住。
示例一:我们平时使用账号密码登录某个网站,一旦登录,这个网站似乎就能记住我们,以至于再次打开该网站,它就能识别出我们。
示例二:我们进入电商网站浏览商品时,电商网站可以记住我们的历史浏览商品。
所以,简单来说,会话管理就是管理浏览器客户端和服务器端之间会话过程中产生的会话数据。
浏览器客户端和服务器端的会话管理涉及的技术有Cookie技术与Session技术,两者的区别在于:
浏览器客户端第一次向服务器发送请求时,服务器接收到请求后,会创建一个Cookie对象,把会话数据(比如浏览器发送过来的用户账号和密码)存储到Cookie对象中,最后把Cookie对象发送到浏览器。浏览器会接收这个Cookie对象,并保存它。
当浏览器第二次向相同的服务器路径发送请求时,会将上次保存的Cookie对象发送给服务器,服务器检查到这个Cookie对象,就能从中取出会话数据,这样服务器就能知道是原先的用户在访问网站。
①关于有效路径
Cookie对象中包含有有效路径,比如使用谷歌浏览器访问百度以后,打开谷歌浏览器的设置->内容设置->Cookie->查看所有Cookie和网站,查看http://www.baidu.com的Cookie,就会显示有效路径:
浏览器只有访问该域名的有效路径时,才会向该服务器发送Cookie信息,也就是访问http://www.baidu.com/时才会发送Cookie信息给服务器。
上面的setPath()就是用于设置有效路径,使用该方法设置成什么,浏览器中保存的Cookie中显示的有效路径就是什么。
②设置Cookie的有效时间
Cookie不是永远保存在浏览器中的,需要我们使用上面的setMaxAge(int expiry)来设置,可以传入正整数、负整数和零:
示例:让网站具有提示用户上次访问的时间的功能
源代码(Servlet):
package demo1;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss"); String currentTime = format.format(new Date()); Cookie[] cookies = request.getCookies(); // 获取浏览器传送过来的Cookie if(cookies == null) { // 如果cookies为空,则表示是浏览器第一次访问本网站,那么就新创建一个Cookie对象,发送给浏览器 Cookie cookie = new Cookie("lastTime", currentTime); cookie.setMaxAge(30*24*60*60); response.addCookie(cookie); response.getWriter().write("您是第一次访问本网站,当前时间为:" + currentTime); }else { // 如果cookies不为空,lastTime不为空,且cookies中有名为lastTime的cookie信息,则向浏览器返回 // 上次登录的时间的信息,并更新lastTime for(Cookie cookie : cookies) { if("lastTime".equals(cookie.getName())) { response.getWriter().write("您上次访问本网站的时间为:" + cookie.getValue() + ", 当前时间为: " + currentTime); cookie.setValue(currentTime); cookie.setMaxAge(30*24*60*60); response.addCookie(cookie); } } } }}
第一次登录时只提示当前时间:
第二次登录时除了提示当前时间,还提示上次访问该网站时的时间:
在浏览器中查看Cookie,可以知道浏览器保存了一个名为lastTime的Cookie:
浏览器第一次访问服务器时,服务器会新建并保存一个session对象,并在该session对象中保存会话数据。然后服务器会创建一个和该session对象对应的名为JSESSIONID的Cookie对象发给浏览器,浏览器将保存这个cookie对象。
浏览器再次访问服务器时,会往服务器发送那个名为JSESSIONID的Cookie对象,服务器根据该Cookie对象的值查询对应的session对象,然后再取出会话数据。
所以,session对象和会话数据都是保存再服务器端的,而名为JSESSIONID的cookie对象就是服务器端分配给浏览器的一把钥匙,一把用于取双方会话数据的钥匙。
示例:模仿用户登录网站,登录一次就可以识别该用户
源代码:
login.html:
Insert title here
fail.html:
Insert title here 登录失败,用户名或密码不正确!
LoginServlet:
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("userName"); String password = request.getParameter("password"); if("admin".equals(userName) && "123456".equals(password)) { // 账号密码验证成功,则通过session保存会话数据,并重定向到成功页面 HttpSession session = request.getSession(); session.setAttribute("userName", userName); response.sendRedirect(request.getContextPath() + "/SuccessServlet"); }else { // 账号密码验证失败,则重定向到失败页面 response.sendRedirect(request.getContextPath() + "/fail.html"); return; } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
SuccessServlet:
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class SuccessServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); HttpSession session = request.getSession(false); if(session != null) { String userName = (String) session.getAttribute("userName"); response.getWriter().write("Hello,"+userName+"! 登录成功"); }else { response.getWriter().write("无效页面!"); } }}
首先使用浏览器访问login.html页面,输入用户名admin,和密码111111(故意输错密码):
提交以后,返回提示登录失败的页面:
重新登录,输入用户名admin,密码123456:
查看浏览器中的cookie,发现果然多了一个名为JSESSIONID的Cookie:
然后,在浏览器打开一个新的标签页,输入http://localhost:8080/SessionProject/SuccessServlet,可以发现直接登录成功,说明服务器已经识别了这个浏览器中的admin用户:
转载地址:http://umnby.baihongyu.com/