文章目录
前言
提示:个人笔记,下面案例可供参考
一、cookie
什么是cookie?
Cookie是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要Cookie没有被清空,或Cookie没有失效,那么,保存在其中的会话状态就有效。
用户在提交第一次请求后,由服务器生成Cookie,并将其封装到响应头中,以相应的形式发送给客户端。客户端收到这个响应后,将cookie保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的cookie数据,发送到服务器,由服务器对会话进行跟踪。
Cookie是由若干个键值对构成,这里的键一般称为name,值成为value。cookie中的键值对均为字符串。
服务器生成cookie:
代码如下(示例):
public class CookieDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建2个cookie
Cookie cookie1 = new Cookie("demoName1", "demoValue1");
Cookie cookie2 = new Cookie("demoName1", "demoValue1");
// 指定cookie绑定的路径。(必须加上req.getContextPath())项目名称
cookie1.setPath(req.getContextPath() + "/aaa/bbb/ccc");
cookie2.setPath(req.getContextPath() + "/ccc/ddd/eee");
//设置cookie的有效期(设置有效期后cookie会保存到硬盘中),单位为秒
cookie1.setMaxAge(60 * 60); // 有效期1小时
cookie2.setMaxAge(60 * 60 * 24); // 有效期1天
// 响应中添加cookie
resp.addCookie(cookie1);
resp.addCookie(cookie2);
}
}
服务器获取并解析cookie:
代码如下(示例):
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求中cookie
Cookie[] cookies = req.getCookies();
// 遍历cookie
for (Cookie cookie : cookies) {
System.out.println(cookies);
}
}
}
二、session
什么是session?
session,即会话,是web开发中的一种会话状态跟踪技术。根cookie不同的是,cookie是将会话状态保存在了客户端,而session是将会话状态保存在了服务器端。
什么是会话?当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。
服务器创建session写入数据:
代码如下(示例):
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取session对象
// getSession()默认为true,如果能获取到就使用,如果没有获取到就创建一个新的session
// 设置为false表示 如果没有获取到session 就返回null
HttpSession session = req.getSession();
// 想session域中写入属性
session.setAttribute("userName","赵四");
}
}
服务器获取session数据
代码如下(示例):
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取session
HttpSession session = req.getSession(false);
String name = null;
if (session != null) {
// 从session中读取指定属性
name = (String) session.getAttribute("userName");
}
PrintWriter writer = resp.getWriter();
writer.println("userName ==" + name);
}
}
session工作原理:
1.写入session列表
其实当前应用中的session是以map的形式进行管理的,这个map成为session列表。该map的key为一个32位长度的随机串,这个随机串为JSessionID,value则为session对象的引用。
当用户第一次提交请求时,服务器servlet中执行到request.getsession()方法后,会自动生成一个map.Entry对象,key为一个根据算法生成的JSessionID,value则为新创建的httpsession对象。
2.服务器生成并发送cookie
在将session信息写入session列表后,系统还会自动将JSessionID作为name,这个32位长度的随机串位value,以cookie的形式存放到响应头中,并随着响应,将cookie发送到客户端。
3.客户端接收并发送cookie
客户端接收到这个cookie后,会将其存放到浏览器的缓存中。即,只要客户端浏览器不关闭,浏览器缓存中的cookie就不会消失。
当用户提交第二次请求时,会将缓存中的cookie,伴随着请求头部信息,一块发送到服务器。
4.从session列表中查找
服务端从请求中读取到客户端发送来的cookie,并根据cookie的JSessionID的值,从map中查找对应key所对应的value,即session对象。然后对该session对象的域属性进行读写操作。
session的失效:
session的失效就是session的超时。若某个session在指定的时间范围内一直未被访问,那么session将超时,即为失效。默认session的超时时间为30分钟。这个时间是从最后一个被访问开始计时,在指定的时间内一直未被访问的时长。
// 使session失效,但失效的session并不为null
session.invalidate();
cookie禁用后重定向跳转session跟踪( url上会暴漏JSessionID ):
String uri=request.getContextPath()+"/aaaa";
// 解决cookie禁用后,session的跟踪问题
uri=response.encodeRedirectURL(uri);
response.sendRedirect(uri);
cookie禁用后非重定向跳转session跟踪( url上会暴漏JSessionID ):
resp.setContentType("test/html;charset=utf-8");
PrintWriter out = resp.getWriter();
String uri = "aaaa";
// 解决cookie禁用后,非重定向的session跟踪问题
uri = resp.encodeURL(uri);
out.println("<a href=' " + uri + " '>跳转</a>到aaaaa");