指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。
简而言之:用户访问网站,关闭浏览器,这和个过程就叫会话。
会话过程要解决的问题
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。Servlet在会话过程中保存数据使用到的技术有两种:Cookie和Session技术。
比如京东,在用户没有登陆的情况下,就是通过cookie保存商品信息。
【小结】
Cookie英文意指饼干,Cookie就是服务器暂存放在我们电脑上的一笔资料(通过浏览器可以查看),使用我们电脑来保存一些服务器希望保存的内容。Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器前提是浏览器设置为启用cookie。
应用场景
登录页面记住密码的功能
实现原理
Cookie常用API
Cookie的基本API包括Cookie的创建,往Cookie中添加数据,获取Cookie中的数据以及将Cookie响应给浏览器。
记住密码的后台代码
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取用户提交信息
String username = request.getParameter("username");
String password = request.getParameter("password");
String check = request.getParameter("check");
//用户是否点击
if ("on".equals(check)){
//用户点击了 创建cookie
//创建cookieAPI
Cookie cookieName = new Cookie("username",username);
Cookie cookiePwd = new Cookie("pwd",password);
//将cookie响应回浏览器
response.addCookie(cookieName);
response.addCookie(cookiePwd);
}
}
}
实践:获取request中的请求OtherServlet.java
登录成功之后,访问一个新的Servlet,在这个Servlet中获取请求携带的cookie。
@WebServlet("/other")
public class OtherServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
//获取cookiename value
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
}
}
结果:
Cookie中的 name=userName;value=zhangsan
Cookie中的 name=password;value=123
Cookie中的 name=JSESSIONID;value=AFEC20664FA3BB22DEC0E2E45684B039
关于cookie特殊字符问题
@WebServlet("/specialServlet")
public class SpecialServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//生成cookie
//编码
String str = "12 34";
String encode = URLEncoder.encode(str, "utf-8");
//特殊字符解决了。。。
Cookie cookie = new Cookie("info",encode);
response.addCookie(cookie);
}
}
获取cookie
@WebServlet("/getServlet")
public class GetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("info")){
//获得编码后的cookie value
String value = cookie.getValue();
//解码
String decode = URLDecoder.decode(value, "utf-8");
System.out.println("decode = " + decode);
}
}
}
}
Cookie的存活时间&有效路径
发现,将浏览器关闭,然后再打开一个新的浏览器,登录页面上记录的用户名和密码消失了,查看浏览器中的cookie,发现之前保存的cookie都消失了。再次登录发现之前设置的cookie的到期时间为“浏览器会话结束”
这样 有点麻烦,我们可以设置cookie的最大存活时间。
概念:
会话级别的Cookie:浏览器关闭后消失。
持久性的cookie:浏览器关闭后能保存一段时间。
Cookie的最大存活时间
方法:void setMaxAge(int seconds)
示例:userNameCookie.setMaxAge(60*60);
说明:
设置Cookie的有效时间:
如果没有设置,cookie只会保存在浏览器的缓存中,浏览器关闭后cookie立即被删除。
如果设置有效时间,在时间范围内,cookie被写入到浏览器端,关闭浏览器下次访问仍可活的,直到过期。
实践:将上述记住密码案例中的cookie的存活时间设置成1个月
@WebServlet("/chijiuhua")
public class PersisitenceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置持久化cookie
Cookie cookie = new Cookie("zhangsan","老张");
cookie.setMaxAge(60*60*24*30);
response.addCookie(cookie);
}
}
Cookie的有效路径。
没有对cookie进行路径设置,默认/,项目各种url都可以访问这个cookie
对cookie进行路径的设置setPath("/web"),当前路径/web以及它子路径/web/a/b可以获取到这个cookie
Cookie的有效路径指的是cookie允许被访问的路径。设置路径,以及子路径都被允许访问。
实践:Cookie的有效路径
需求:
在CookieServlet1中创建一个Cookie,设置路径为“/web/a/b”;
新建一个CookieServlet2,映射路径为“/web/b”
新建一个CookieServlet3,映射路径为"/web/a/b";
新建一个CookieServlet4,映射路径为"/web/a/b/c";
新建一个CookieServlet4,映射路径为"/web/a/d";
分别在CookieServlet2,CookieServlet3,CookieServlet4,CookieServlet5中获取cookie;
@WebServlet("/path")
public class PathServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("path","testpath");
//cookie设置路径
cookie.setPath("/path");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
}
}
获取cookie
@WebServlet("/path/b/a")
public class PathTwoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies){
//获取cookie的名字和值
String name = c.getName();
String value = c.getValue();
System.out.println("name = " + name);
System.out.println("value = " + value);
}
}
}
结果:
当给cookie设置有效路径"/web/a/b"后:
【结论】
当设置cookie的有效路径后,只能在有效路径或其子路径下访问这个cookie;
如果不给cookie设置有效路径,默认的有效路径为"/",即在当前Tomcat下的任意访问路径均可以获取这个cookie。
一般情况下,不必给cookie设置有效路径。
Cookie删除
通常情况下,如果浏览器中的cookie存储的太多,我们需要手动清除浏览器中的cookie。这是通过客户端的技术删除存储在浏览器中的cookie。Servlet中没有专门提供API去删除cookie。我们可以通过以下方式删除cookie;
【操作步骤】
@WebServlet("/chi")
public class ChiServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//实现持久化session
HttpSession session = request.getSession();
//获取sessionid
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID",id);
//是cookie持久化
cookie.setMaxAge(60*30);
//响应回浏览器
response.addCookie(cookie);
}
}
【小结】让cookie消失的几种方法
总结:
·