版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiaziliping/article/details/78872617
参考文档: https://www.cnblogs.com/xdp-gacl/p/3803033.html
一、会话的概念
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话。
二、cookie的作用
我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。
三、和session机制的区别
机制的区别:
session机制采用的是在服务器端保持状态的方案,而cookie机制则是在客户端保持状态的方案,cookie又叫会话跟踪机制。打开一次浏览器到关闭浏览器算是一次会话。说到这里,讲下HTTP协议,前面提到,HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。此时,服务器无法从链接上跟踪会话。cookie可以跟踪会话,弥补HTTP无状态协议的不足。
三、cookie工具类
/**
* Cookie 辅助类
*/
public class CookieUtils {
/**
* 每页条数cookie名称
*/
public static final String COOKIE_PAGE_SIZE = "_cookie_page_size";
/**
* 默认每页条数
*/
public static final int DEFAULT_SIZE = 20;
/**
* 最大每页条数
*/
public static final int MAX_SIZE = 200;
/**
* 获得cookie的每页条数 使用_cookie_page_size作为cookie name
*
* @param request
* @return default:20 max:200
*/
public static int getPageSize(HttpServletRequest request) {
Assert.notNull(request);
Cookie cookie = getCookie(request, COOKIE_PAGE_SIZE);
int count = 0;
if (cookie != null) {
if (NumberUtils.isDigits(cookie.getValue())) {
count = Integer.parseInt(cookie.getValue());
}
}
if (count <= 0) {
count = DEFAULT_SIZE;
} else if (count > MAX_SIZE) {
count = MAX_SIZE;
}
return count;
}
/**
* 获得cookie
*
* @param request
* @param name
* cookie name
* @return if exist return cookie, else return null.
*/
public static Cookie getCookie(HttpServletRequest request, String name) {
Assert.notNull(request);
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if (c.getName().equals(name)) {
return c;
}
}
}
return null;
}
/**
* 根据部署路径,将cookie保存在根目录。
*
* @param request
* @param response
* @param name
* @param value
* @param expiry
* @param domain
* @return
*/
public static Cookie addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value,
Integer expiry, String domain) {
Cookie cookie = new Cookie(name, value);
if (expiry != null) {
cookie.setMaxAge(expiry);
}
if (StringUtils.isNotBlank(domain)) {
cookie.setDomain(domain);
}
String ctx = request.getContextPath();
cookie.setPath(StringUtils.isBlank(ctx) ? "/" : ctx);
response.addCookie(cookie);
return cookie;
}
/**
* 取消cookie
*
* @param request
* @param response
* @param name
* @param domain
*/
public static void cancleCookie(HttpServletRequest request, HttpServletResponse response, String name,
String domain) {
Cookie cookie = new Cookie(name, "");
cookie.setMaxAge(0); //设置maxage为0表示去清除
String ctx = request.getContextPath();
cookie.setPath(StringUtils.isBlank(ctx) ? "/" : ctx);
if (StringUtils.isNotBlank(domain)) {
cookie.setDomain(domain);
}
response.addCookie(cookie);
}
}
3.1 cookie的过期形式
cookie过期时间设置方式:
cookie.setMaxAge(0);//不记录cookie
cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效
cookie.setMaxAge(60*60);//过期时间为1小时