Cookie和Session区别:
- 1、Cookie 在客户端(浏览器),Session 在服务器端。
- 2、Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie就好了。
- 3、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
- 4、Session 可以放在 文件、数据库或内存中,比如在使用Node时将Session保存在redis中。由于一定时间内它是保存在服务器上的,当访问增多时,会较大地占用服务器的性能。考虑到减轻服务器性能方面,应当适时使用Cookie。
- 5、Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)。
- 6、用户验证这种场合一般会用 Session。因此,维持一个会话的核心就是客户端的唯一标识,即Session ID。
Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
Cookie常用的方法
public class HelloDispatcher extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//新建一个cookie,并把当前系统时间作为cookie响应给客户端
Cookie cookie = new Cookie("mycookie",System.currentTimeMillis()+"");
cookie.setMaxAge(24*60*60);//设置cookie的有效期为一天
resp.addCookie(cookie);//响应给客户端一个cookie
//---------------上面创建cookie,下面获取cookie---------------------------
Cookie[] cookies = req.getCookies();//拿到的cookies是一个数组,数组里面的元素都是键值对
for (Cookie cookie : cookies) {
cookie.getName();//拿到数组中键值对的key --- mycookie
cookie.getValue();//拿到数组中键值对的value --- 系统时间
}
}
cookie.setMaxAge(0);//设置cookie的有效期为0,每次刷新,cookie就会被删除
Cookie cookie = new Cookie("mycookie",System.currentTimeMillis()+"");
//新建一个cookie,并用中文设置cookie的value
Cookie cookie = new Cookie("mycookie", "乾坤大挪移");
resp.addCookie(cookie);//响应给客户端一个cookie
//------------------------------------------------
//如果在浏览器上乱码(在已设置setCharacterEncoding("utf-8")的情况下),可以使用URLEncoder.encode编码,
Cookie cookie = new Cookie("mycookie", URLEncoder.encode("乾坤大挪移","utf-8"));
resp.addCookie(cookie);//响应给客户端一个cookie
//---------------------------------------------------
//想要拿到浏览器cookie的中文value,可以先拿到Cookie数组,再用URLDecoder.decode对每一个键值对的value进行解码
URLDecoder.decode(cookie.getValue(),"utf-8");
Session(重点)
什么是session?
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就一直存在
- 用户登录一个网站后,网站内的其他页面也可以以登录的状态访问(保存用户信息)
Session常用的方法
public class HelloSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得Session
HttpSession session = req.getSession();
//给Session里面存信息,对象(类)要自己创建并定义属性:Person(id,name,paaword)
session.setAttribute("person",new Person(007,"乾坤大挪移","1213141516"));
//获取Session的ID,一般通过SessionID判断是不是同一个Session
String sessionId = session.getId();
//判断Session是不是新创建的
session.isNew();
}
- 由于Session是放在服务器上的,所以获取Session不需要获取上下文
//获取session里面存入的指定对象
Person person = (Person) session.getAttribute("person");
//打印person对象
System.out.println(person.toString());
//把之前存进去的session清除,手动注销session
session.removeAttribute("person");
//注销session,但是会立马生产一个新的
session.invalidate();
- 上面的手动注销可以用于用户手动注销,下面的到时注销,可用于网站的Session保存策略
<!--会话自动过期设置,在web.xml中设置-->
<!--设置Session的失效时间:以分钟为单位-->
<session-config>
<!--15分钟后自动失效-->
<session-timeout>15</session-timeout>
</session-config>
使用场景:
- 保存一个用户登录的信息
- 购物车信息
- 在整个网站中经常会使用的数据,保存在session中(保存重要信息,减少服务器资源浪费)