会话
cookie
cookie是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。
服务器创建cookie将cookie放入响应对象中,Tomcat容器将cookie转化为set-cookie响应头响应给客户端
客户端在收到cookie的响应头时,在夏床请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookie
cookie是一种键值对格式的数据,从tomcat8.5开始可以保存中文但是不推荐
由于cookie是存储于客户端的数据,比较容易暴露,一般不存储一些敏感或者影响安全的数据
cookie的时效性
- 会话级cookie
- 服务器端并没有明确指定cookie的存在时间
- 在浏览器端,cookie数据存在于内存中
- 只要浏览器还开着,cookie数据就一直都在
- 浏览器关闭内存中的cookie数据就会被释放
- 持久化cookie
- 服务器端明确设置了cookie的存在时间(setMaxAge方法)
- 在浏览器端,cookie数据会被保存到硬盘上
- cookie在硬盘上存在时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
- 持久化cookie到达了预设的时间就会被释放
创建Cookie:
import javax.servlet.http.Cookie;
Cookie cookie = new Cookie("username", "John Doe");
cookie.setMaxAge(3600); // 设置Cookie的有效期为1小时
response.addCookie(cookie); // 将Cookie添加到响应中
读取Cookie:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")) {
String username = cookie.getValue();
// 处理Cookie中的值
}
}
}
删除Cookie:
Cookie cookie = new Cookie("username", "");
cookie.setMaxAge(0); // 设置Cookie的有效期为0,即立即过期
response.addCookie(cookie); // 将过期的Cookie添加到响应中,从而删除它
设置Cookie的路径和域:
Cookie cookie = new Cookie("username", "John Doe");
cookie.setPath("/"); // 设置Cookie的路径
cookie.setDomain(".example.com"); // 设置Cookie的域
response.addCookie(cookie); // 将Cookie添加到响应中
设置Secure和HttpOnly标志:
Cookie cookie = new Cookie("username", "John Doe");
cookie.setSecure(true); // 设置Secure标志,只在HTTPS连接下传输
cookie.setHttpOnly(true); // 设置HttpOnly标志,防止通过JavaScript访问Cookie
response.addCookie(cookie); // 将包含安全标志的Cookie添加到响应中
总结:
Cookie在Web开发中是一种重要的机制,用于在客户端存储数据。通过JavaScript可以方便地操作和管理Cookie,包括创建、读取、删除以及设置属性等操作。确保在使用Cookie时遵循最佳实践,尤其是涉及用户隐私和安全性的方面。
Session
概述
HttpSession是一种保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间,即session对象,客户端在发送请求时,都可以使用自己的session这样服务端就可以通过session来记录某个客户端的状态了
- 服务端在为客户端创建session时,会同时将session对象的id,即JSESSIONID以cookie的形式放入响应对象
- 后端搭建完session后客户端会收到一个特殊的cookie叫做JSESSIONID
- 客户端下一次请求时携带JSESSIONID,后端收到后,根据JSESSIONID找到对应的session对象
- 通过该机制,服务端通过session就可以存储一些专门正对某个客户端的信息了
- session也是域对象
常用方法
// 在Servlet中或获取会话
//若没有session则创建一个新的并返回,并向response对象中存放一个JSESSIONID的cookie
HttpSession session = request.getSession();
// 设置会话属性
session.setAttribute("username", "JohnDoe");
// 获取会话属性
String username = (String) session.getAttribute("username");
// 删除会话属性
session.removeAttribute("username");
// 使会话无效
session.invalidate();
//获取JSESSIONID
session.getId();
//判断当前session是否为新创建
session.idNew();
域对象
概述
域对象:一些用于存储数据和传递数据的对象,传递数据不同的范围,外卖称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同
- 请求域对象是HttpServletRequest,传递数据的范围是一次请求之内及请求转发
- 会话域对象是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求
- 应用域对象是ServletContext,传递数据的范围是本应用之内,可以跨多个会话
域对象的API
//向域对象中添加/修改数据
void setAttribute(String name,String value);
//从域对象中获得数据
Object getAttribute(String name);
//移除域对象中的数据
removeAttribute(String name);
ServletA向三大域中放入数据
@WebServlet("/servletA")
public class ServletA extends HttpServlet{
@Override
protected void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
//向请求域放入数据
req.setAttribute("request","request-message");
//通过请求转发传递req和resp到servletB
//req.getRequestDispatcher("servletB").forward(req,resp);
//向会话域中放入数据
HttpSession session = req.getSession();
session.setAttribute("session","session-massage");
//向应用域中放入数据
ServletContext application = getServletContext();
application.setAttribute("application","application-message");
}
}
ServletB从三大域中取出数据
@WebServlet("/servletB")
public class ServletB extends HttpServlet{
@Override
protected void service(HttpServletRequest req , HttpServletResponse resp) throws ServletException , IOException{
//从请求域中获取数据
String reqMessage = (String)req.getAttribute("request");
System.out.println(reqMessage);
//从会话域中获取数据
HttpSession session = req.getSession();
String sessionMessage = (String)session.getAttribute("session");
System.out.println(sessionMessage);
//从应用域中获取数据
ServletContext application = getServletContext();
String applicationMessage = (String)application.getAttribute("application");
System.out.println(applicationMessage);
}
}
结论
- 请求转发时,请求域跨域传递数据,请求域内一般放本次业务有关的数据
- 同一个会话内,不用请求转发,会话域跨域传递数据,会话域一般放本次会话的客户端有关的数据
- 同一个APP内,不同的客户端,应用域可以传递数据,应用域内一般存放本程序应用有关的数据