浅谈cookie与session
学校web作业做的不少,对cookie与session也用了蛮多,在此小计一些干货
由于HTTP协议是无状态的,连接建立成功后便释放了,那么如何知道xxx,yyy操作都属于zzz呢? cookie与session就是用来解决这个问题
SESSION与COOKIE的一些重要知识点:
cookie与session都是会话技术
session存储在服务器端(默认存在文件里不是内存),cookie存储在客户端(浏览器)有一定的安全隐患
session的运行依赖sessionID,第一次创建session时候,服务器端会自动在cookie中添加该session对象的JSESSIONID=ID.
session可以放在文件里、内存里、数据库里
浏览器端禁用了cookie,同理session也会失效因为sessionID传不过去了,可以通过URL重传,在其后面加上sessionID,如果页面多连接多,会增加不必要的工作量,那可以强制让你用户开启接收Cookie后再让其访问即可。
用户登录用cookie还是用session存储的一些思考
思路一:用户登录成功,视需求在服务器端存储必要信息至cookie中如账号、姓名、年龄给前台。
场景:
访问受限资源时前台需要判断用户是否登陆:看js能不能获取到指定cookie信息。
服务器端若需判断用户是否登录:看服务器端能不能获取到用户的相关cookie信息。
缺陷:cookie欺骗容易造成安全隐患。
思路二:用户登陆成功,持久层查找到该用户并用session将用户信息都存储起来,只给前台一个SESSIONID。并返回用户一些json数据。
场景:
前台需要判断用户是否登录:发送请求至服务器端看session里用户是否为空,服务器端返回结果。
服务器端判断用户是否登陆:看session里面用户是否为空。
虽说提高了安全性,但对服务器访问次数增加了啊.每一次看受限制界面都要去服务器端请求一次看是否登陆了
cookie基本用法:
前端使用cookie
【jquery方式】:https://www.cnblogs.com/webcome/p/5470975.html
【js方式】:https://blog.csdn.net/zaynahly/article/details/75514988
java使用cookie:
java使用cookie要注意中文乱码问题,cookie默认存储的是ASCII字符在内存中占2个字节,中文属于UNICODE字符在内存中占4个字节。要进行解码操作,使用java.net.URLEncoder类。session的话不需要考虑中文乱码问题
private final static String URL_CODE = "UTF-8"; //添加cookie public static void addCookie(HttpServletResponse resp, String key, String value) { try { Cookie cookie = new Cookie(key, URLEncoder.encode(value, URL_CODE)); cookie.setPath("/"); resp.addCookie(cookie); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //获取指定cookie private static String getCookie(HttpServletRequest req, String key) { Cookie[] cookies = req.getCookies(); if (cookies != null) { try { for (Cookie cookie : cookies) { if (cookie.getName().equals(key)) { return URLDecoder.decode(cookie.getValue(), URL_CODE); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return "-1"; } //清空cookie public static void clearCookie(HttpServletRequest req, HttpServletResponse resp) { Cookie[] cookies = req.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { cookie.setMaxAge(0); cookie.setPath("/"); resp.addCookie(cookie); } } }
注意点:
cookie中文乱码问题
cookie不设置过期时间的话则默认是浏览器关闭cookie就失效了
cookie.setMaxAge(Integer.MAX_VALUE);//设置永不过期
cookie.setMaxAge(0);//不记录cookie cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效,默认
设置永不过期