目录
一、Session会话技术
概念
常用方法
生命周期
有效期
场景
二、Cookie技术
一、Session会话技术
概念
浏览器和服务器之间为了实现某个功能,产生了多次请求和响应,从第一次请求开始到最后一次请求结束,这期间所有的请求和响应加起来称之为一次会话。会话要解决的最重要的问题是:如何存储产生的数据。
- Session是javaweb提供的解决会话数据存储相关的技术
- Session是服务器端技术,将会话产生的数据存储在服务器端。这种技术的优点是比较安全,(相比于Cookie存储在客户端的方式要安全的多);缺点是如果存储的数据量较大的话,容易出现服务器端爆满。
- Session技术在服务器端为每一个客户端创建各自的session对象,用来存储该客户端会话产生的数据.
- 每一个客户端都使用各自对应的sessionm对象,不会造成混乱
常用方法
会话(Session)是一种在客户端和服务器之间存储和传递数据的机制。在Java中,可以使用HttpSession
接口提供的方法来管理会话。
HTTPSession session = request.getSession();
session.setAttribute("name","zs");
String name = (String)session.getAttribute("name");
请求会话,设置会话属性。属性名为 "name",值是"zs",接收的时候是设定接收对象的属性名,因为返回类型是Object,所以需要强转。
session.removeAttribute("name"); //移除会话的属性名为"name"的信息
session.invalidate(); //杀死会话
生命周期
session的生命周期指的是从Servlet容器创建session对象到销毁的过程。Servlet容器会依据session对象设置的存活时间,在达到session时间后将session对象销毁。session生成后,只要用户继续访问,服务器就会更新session的最后访问时间,并维护该session。
有效期
session一般在内存中存放,内存空间本身大小就有一定的局限性,因此session需要采用一种过期删除的机制来确保session信息不会一直累积,来防止内存溢出的发生。
session的超时时间可以通过maxInactiveInterval属性来设置。
如果我们想让session失效的话,也可以当通过调用session的invalidate()来完成。
场景
比如用户A在浏览器注册界面点击验证码刷新,服务器端会传回验证码值,如果后端使用的技术不是Session而是直接采用的是web应用域(全局域),假设此时同时有个用户B也在刷新验证码,A请求返回的验证码值就会被B的请求值覆盖;而会话技术在一次完整的会话结束之前,不会被其它人覆盖。
二、Cookie技术
1、Cookie是javaweb提供的解决会话数据的存储相关技术
2 、Cookie是客户端技术,将会话产生的数据存储在客户端
3、 Cookie基于set-Cookie响应头,和Cookie请求头工作.
4 、当服务器需要保存相关会话数据时,通过set-Cookie响应头命令浏览器保存指定数据,浏览器收到这个命令后就会将数据保存在浏览器的Cookie中.
5 、之后当再次去访问服务器时,浏览器通过Cookie请求头将保存的数据再次带回服务器端,服务器可以从中获取数据.
6、 每一个浏览器各自保存各自的Cookie信息,保证数据不混乱
客户端 服务器端
在BuySerevlet类下:
public class BuyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String prod = request.getParameter("prod");
response.setHeader("set-Cookie","prod="+prod);
}
在PayServlet类下:
public class PayServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getHeader("Cookie"));
}
从客户端设置数据prod,通过set-Cookie响应头命令浏览器保存prod数据,浏览器收到这个命令后就会将数据保存在浏览器的Cookie中.
之后当再次去访问服务器时,浏览器通过Cookie请求头将保存的数据再次带回服务器端,服务器可以从中获取数据.
虽然Cookie是通过setHeader设置响应头来进行操作的,但是实际项目中由Cookie API提供相关方法来保存数据。
先new出Cookie对象:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","zs");
c1.setMaxAge(60*60*24);
c1.setPath(request.getContextPath()+"/");
response.addCookie(c1);
}
setMaxAge()是设置cookie保存数据在浏览器的留存时间(s为单位)
setPath()是设置cookie路径,在设置的路径下(包括其子路径),都会获得请求头信息。
addCookie()是通过set-Cookie响应头命令浏览器保存数据,浏览器通过Cookie请求头将保存的数据再次带回服务器端接收:request.getCookies();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie c : cookies){
System.out.println(c.getName()+":"+c.getValue());
}
}
}
接收返回类型是Cookie数组,不为空时,打印头中的名字和值信息。