1、什么是会话?
用户打开浏览器,浏览页面,直到关闭浏览器的过程,称为一次会话。
2、什么是会话技术?
因为HTTP是一个无状态协议,服务端无法记录客户端的身份信息。
例如在购物网站购买东西时,需要用到的购物车(记录用户挑选的商品),这时会发现request无法做到,ServletContext也无法做到。
因此需要用到会话跟踪技术。
3、会话跟踪技术包括:Cookie(客户端技术) Session(服务器端技术)
Cookie
1、服务器负责:
1.负责写cookie
2.负责解析浏览器传过来的cookie
浏览器负责:
1.负责保存cookie
2.负责将cookie发送给服务器
2、工作原理
学生上学入学时交学费,但同时入学的人太多,学校也无法准确记住每个人的信息(HTTP无状态)
所以在每个学生入学时发一个学生证,证件上记录学生的信息(Cookie)
在学生上学时,只需要带着学生证,就可以知道这个学生的信息
当第一次请求到达时,服务创建一个Cookie,并且把cookie响应给客户端(浏览器),
当浏览器进行第二次请求时,携带上次请求时的cookie的信息,服务端就会识别到本次请求和上次请求在一个会话之内。
3、使用方法
1 构造方法: Cookie c = new Cookie(“”,“”);
创建Cookie时, name和value都是字符串。注意:不能用中文字符串。
2 getName() 获得Cookie的name
3 getValue() 获得Cookie的value 注意:Cookie没有提供根据name获取value的方法
4 setMaxAge(int 秒) 设置Cookie的存活时间
cookie.setMaxAge(int seconds);
seconds > 0: 存货多长时间;
seconds =0: 立即失效
seconds <0: 会话cookie
5 setPath() 设置Cookie的有效路径
浏览器将cookie保存硬盘的路径,是各个浏览器自己制定,其他无法进行操作的。
有效路径:浏览器发送请求时,cookie的代入路径。
请求路径 等于或者包含cookie的有效路径,该cookie会在请求时被代入。
方法名 |
描述 |
setPath(java.lang.String uri) |
设置有效路径。 设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。 例如:setPath("/web/a/b"); http://localhost:8080/web/a/b/oneServlet,可访问(当前路径) http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径) http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径) 常见设置:setPath(“/”) ,当前tomcat下的所有的web项目都可以访问 |
7 获得客户端带过来的Cookie
Cookie[] cs = request.getCookies()
8 服务器端把Cookie带到客户端
response.addCookie(cookie);
4、案例一:记录客户端是否是第一次访问
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.jasper.tagplugins.jstl.core.ForEach; @WebServlet("/login1") public class CookieLoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); response.setContentType("text/html;charset=utf-8"); boolean flag = false; Cookie[] cookies = request.getCookies(); if(cookies != null) { for (Cookie cookie : cookies) { if("username".equals(cookie.getName())) { flag=true; break; } } } String str = "欢迎第一次访问!!"; if(flag) { str = "欢迎回来"; }else { Cookie coo1 = new Cookie("username", username); Cookie coo2 = new Cookie("password", password); coo1.setMaxAge(3); response.addCookie(coo1); response.addCookie(coo2); } response.getWriter().println("<h1>"+str+"</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="login1" method="post"> 用户名:<input type="text" name="username"/><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="登录"/> </form> </body> </html>
5、案例二:使用Cookie记录客户端上次访问时间
import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/cookieLogin2") public class MyServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); String str = "欢迎光临!!"; Cookie[] cookies = request.getCookies(); if(cookies !=null) { for (Cookie cookie : cookies) { if("visited".equals(cookie.getName())) { str = "您上次访问时间为"+cookie.getValue(); break; } } } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd--HH:mm:ss"); Date date = new Date(); String da = sdf.format(date); Cookie cookie = new Cookie("visited", da); response.addCookie(cookie); response.getWriter().println("<h1>"+str+"</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="cookieLogin2" method="post"> 用户名:<input type="text" name="username"/><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="登录"/> </form> </body> </html>
6、案例三:使用Cookie记录访问次数
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/cookieLogin3") public class Myservlet3 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); boolean flag = false; Cookie coo=null; Cookie[] cookies = request.getCookies(); if(cookies != null) { for (Cookie cookie : cookies) { if("count".equals(cookie.getName())) { coo=cookie; flag=true; break; } } } int num=1; if(flag) { num = Integer.parseInt(coo.getValue())+1; } Cookie c = new Cookie("count", num+""); response.addCookie(c); response.getWriter().println("<h1>您是第"+num+"次访问</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="cookieLogin3" method="post"> 用户名:<input type="text" name="username"/><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="登录"/> </form> </body> </html>
Session
1、会话管理已经有了Cookie,为什么还要有Session?
Cookie有大小和个数的限制的. Session存在服务器端没有大小和个数的限制.
Cookie存到客户端上 信息不安全. Session的数据相对来说安全.
Session运行原理也是基于Cookie :利用Cookie回写一个 JSESSIONID
2、获取Session
方式一: HttpSession session = request.getSession()
如果session还没有创建,则创建。
如果已经创建,则使用已经创建的session。
方式二: HttpSession session = request.getSession(false);
如果session已经创建过,则使用已经创建的session。
如果session没有创建过,则返回null。
Session的getId() 方法可以获得Session的id
3、Session的常用方法
session.setAttribute("",Object);
session.getAttribute("");
session.removeAttribute("");
4、Session的案例一:如果是第一次访问则输出第一次访问,如果不是,则输出欢迎回来。
如果页面放入了文件夹,要注意加上项目路径或者 使用 ../ 出文件夹再写想要访问的路径
import java.io.IOException; 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("/sessionLogin1") public class Myservlet1 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); String str = ""; HttpSession session = request.getSession(false); if(session!=null) { str = "欢迎回来"; }else { str="第一次访问"; session=request.getSession(); } response.getWriter().println("<h1>"+str+"</h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="/会话/sessionLogin1" method="post"> 用户名:<input type="text" name="username"/><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="登录"/> </form> </body> </html>
5、Session的创建和销毁
第一次调用getSession()是创建Session
销毁:1.服务器的非正常关闭(如果是正常关闭,Session会被序列化到服务器中,也叫钝化,在下次服务器启动时会再次激活,也叫活化)
2.Session的时间到期,默认30分钟,默认配置在tomcat的web.xml中
<session-config>
<session-timeout>30</session-timeout>
</session-config>
可以在自己的web.xml配置Session的过去时间,配置方式和tomcat的web.xml中配置方式相同。
3.调用Session的invalidate()方法
6、Session和Cookie的关系 及区别
Session运行原理也是基于Cookie :利用Cookie回写一个 JSESSIONID
1.数据存储的位置不同 Cookie在客户端 Session在服务器端
2.生命周期不同
Cookie(会话Cookie浏览器关闭 持久化Cookie setMaxAge(秒数))Session(默认30分钟,可以修改)
3.cookie只能存放字符串名值对,session可以是任意对象
4.同一个浏览器接受cookie的个数是有上限
7、浏览器禁用Cookie后,Session将不能使用
还想继续使用:手动在路径后面拼接一个JSESSIONID 如 ;jsessionid=r7boiko6m95lg180mla9oib562
或者使用response的encodeRedirectURL()方法
String path = "/testServlset";
String path1 = response.encodeRedirectURL(path);
response.sendRedirect(path1);
禁用Cookie还想使用Session,那么将你网站的所有的路径 都需要进行URL的重写.
一般在真实应用中,当禁用了Cookie时,将不能使用Session.
例如购物网站,在禁用Cookie后,则无法进行购物。
8、Servlet的三个作用域详解
HttpServletRequest:客户端向服务器发送一次请求,服务器就会创建一个request对象,当服务器对这次请求做出响应后,request对象就失效了 作用域范围:一次请求的范围
HttpSession:第一次调用getSession()时创建,销毁:不正常关闭服务器,过期,调用invalidate方法;作用域范围:一次会话的范围
ServletContext:服务器启动时创建对象,服务器关闭时销毁,作用域范围是整个项目