Cookie
Cookies基本使用
Cookie : 客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据访问,让服务端通过Cookie来识别客户端。
- Cookie的基本使用:
- 创建Cookies对象, 设置数据
Cookie cookie = new Cookie("key", "value");
- 发送Cookie给客户端:使用response对象
response.addCookie(cookie);
- 获取客户端携带的所有Cookie对象:使用request对象
Cookie[] cookies = request.getCookies();//使用cookies时注意判断空指针异常
- 遍历数组,获取每一个Cookie对象
- 使用Cookies对象方法获取数据
cookie.getName();cookie.getValue();
Cookie原理
- Cookie的实现是基于Http协议的
- 响应头:set-cookie
- 请求头:cookie
Cookie使用细节
- Cookie的存活时间
- 默认情况下,Cookie存储在浏览器中,当浏览器关闭,内存释放,则Cookie被销毁。
- setMaxAge(int seconds): 设置Cookie的存活时间
- 正数:持久化到磁盘中,到时间自动删除
- 负数(默认值):存放在内存中,浏览器关闭自动删除
- 0:立即删除对应Cookie
Cookie存储中文
- Cookie不能直接存储中文,可以先将中文通过URLEncoder.encode()进行URL编码后存储,需要访问时再进行URL解码。
Session
Session基本使用
Session:服务端会话跟踪技术,将数据保存到服务端。(JavaEE提供了HttpSession接口,来实现一次会话的多次请求的数据共享)
使用:
- 获取Session对象
HttpSession session = request.getSession();
- Session对象功能
- void setAttribute(String name, Object o) : 存储数据到session域中
- Object getAttribute(String name) : 根据key,获取值
- void removeAttribute(String name):根据key,删除该键值对
Session原理
- Session是基于Cookie实现的
Session使用细节
-
Session钝化、活化
- 钝化:服务器正常关闭时,Tomcats会自动将Session数据写入硬盘的文件中
- 活化:再次启动服务器时,从文件中加载数据到Session中
-
Session销毁
- 默认情况,无操作后30分钟自动销毁
<session-config> <session-timeout>30</session-timeout> </session-config>
- 调用Session对象的invalidate()方法销毁自己
小结
- Cookis和Session都是来完成一次会话内多次请求间数据共享的
- 区别:
- 存储位置:Cookie是将数据存储到客户端,Session将数据存储到服务端
- 安全性:Cookie不安全(可能被拦截),Session安全
- 数据大小:Cookie最大3KB,Session无大小限制
- 存储时间:Cookie可以长期存储,Session默认30分钟
- 服务器性能:Cookie不占服务器资源,Session占用服务器资源
举例
testController类中的test01()方法实现的功能:当你第一次访问localhost:8080/FromZerotoExpert时会显示Hi, Welcome To From Zero To Expert,第二次访问时会显示Hello, Welcome Again To From Zero To Expert。
@RestController
public class testController {
@GetMapping("/FromZerotoExpert")
public String Test01(HttpServletResponse response, HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
Cookie myCookie = null;
// 注意判断cookies是否指向空指针, 否则当浏览器没有cookie时,会抛出空指针异常
if (cookies != null) {
// 遍历cookies,找到对应的cookie
for (Cookie cookie : cookies) {
// Java中字符串的比较不能用 ==
// cookie的key和value都要判断,防止伪造cookie
if (cookie.getName().equals("wcx") && cookie.getValue().equals("001")) {
myCookie = cookie;
break;
}
}
}
if (myCookie != null) {
return "Hello, Welcome Again To From Zero To Expert";
} else {
Cookie newCookie = new Cookie("wcx", "001");
// 设置newCookie的存活时间为24小时
newCookie.setMaxAge(24 * 3600);
response.addCookie(newCookie);
return "Hi, Welcome To From Zero To Expert";
}
}
}
怎么实现判断是第一次登录和自动登录思路
简单说下怎么判断用户是否是第一次登录网站,我的实现思路:我认为主要是在服务端实现。
首先,客户端浏览器向服务端发送一个登录请求,如果用户是在这个浏览器中第一次登录,通过了登录验证的话,服务器创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),服务器在把这个sessionId以Cookie的形式返回给客户端浏览器,客户端浏览器会把这个sessionId记到自己的cookie缓存中,以及cookie生效的路径(你只有向目标服务器发送请求才会携带这个sessionId的cookie)。下一次客户端浏览器再向服务器发送请求就会携带上sessionId,服务器就可以根据这个sessionId判断是否是第一次登录(如果客户端请求中包含sessionId,说明不是第一次登录,如果不包含,则进行登录验证,验证通过,返回sessinId),后面服务器也可以直接根据请求中sessionId判断这个请求是否有执行某个操作的权限。比如,你关闭浏览器后,当你下次再用这个缓存了sessionId的cookie的浏览器(只要这个sessionId的cookie在浏览器的生存时间不是关闭浏览器被清除,而是持久化到硬盘中一段时间)进入服务端,在前端页面初始化时可以发送一个login请求,携带上sessionId的cookie,给服务端,服务端根据sessionId的合理性判断是否登录成功,若通过,客户端浏览器就成功登录了,实现了自动登录。要实现这个功能可能需要对cookie和session的作用和原理有个比较清楚的了解,我也是看了网上几篇博客以及帅地哥他对cookie面试总结,可能简单了解了cookie和session。
这个方法应该考虑到安全性,前端只负责发送请求,没有对数据做任何验证处理,如果用户自己构造一个不存在的sessionId的cookie发给服务端,服务端验证是可以不通过的。