目录
4、Cookie,Session
4.1、会话
会话:用户打开浏览器,访问了许多的网络资源,然后关闭了浏览器,这个过程就可以称之为会话。
有状态会话:一个用户打开了浏览器,然后关闭了浏览器,再打开浏览器的时候,浏览器知道你曾经来过,这个可以称之为有状态会话。
这里有一个问题:一个网站,怎么证明你曾经来过?
- 服务端给你一个信物,客户端下次再访问这个网站的时候带上这个信物,就能证明你曾经来过,这个相当于 cookie
- 服务端登记你来过了,但是没给你信物,你下次来的时候服务端会去众多曾经来过的对象中去匹配你,匹配到了就证明你曾经来过这个网站,相当于session
4.2、保存会话的两种技术
- cookie:
- 客户端技术(响应,请求)
- session:
- 服务端技术,利用这个技术,可以保存用户的会话信息,我们可以把用户信息存放到session中,例如常见的我们打开一个网站登录了,关闭了之后,服务器再session中保存了你的会话信息了,那你下次来的时候就不用再登录了。
4.3、cookie
1、从请求中拿到cookie信息
2、服务器响应给客户端cookie
//获得cookie
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
//获得cookie中的key
cookie.getName();
//获得cookie中的value
cookie.getValue();
//设置cookie的有效期
cookie.setMaxAge(24*60*60);
}
//新建一个cookie
Cookie time = new Cookie("time", System.currentTimeMillis() + "");
//响应给客户端一个cookie
resp.addCookie(time);
Cookie一般会再本地的用户目录下的appdata
- 一个cookie只能保存一个信息
- 一个web网站可以给浏览器发送多个cookie,最多存放20个cookie;
- Cookie大小有限制4kb;
- 浏览器上限是300个cookie;
- 不设置有效期,关闭浏览器,cookie自动失效
- 要删除cookie可以设置有效期为0,或者不设置有效期
编码解码
URLEncoder.encode("小张","utf-8");
URLDecoder.decode(cookie.getValue(),"utf-8");
4.4、Session
什么是Session
- 用户打开浏览器登录一个网站后,服务端就会给用户(也就是浏览器)创建一个session
- 一个session独占一个浏览器,只要浏览器不关闭,session就一直存在,客户端拿到的是sessionID,是唯一的
- 用户登录之后,获得到服务端创建的一个session,整个网站它都可以访问,比如用户的登录信息,用户的购物车信息等,都能够从session中获取到(一般这些信息是被保存在session中的,然后用cookie携带sessionID发送给用户)
Cookie和Session的区别
- Cookie是把用户的数据写到cookie中发给用户,浏览器保存(可以存多个)
- Session是把用户的数据写到用户独占的session中,服务端保存(保存用户的重要信息,减少服务器资源浪费)
- Session对象由服务创建
设置session自动过期
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后Session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
一般session默认的失效时间是30分钟,只要客户端一直在访问服务端,服务端就会对session进行维护更新,知道客户端不再访问浏览器了,记录最后一次访问的时间,以此开始计时失效的时间
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("name",new Person("张三",1));
//获取Session的ID
String sessionId = session.getId();
//判断Session是不是新创建
if (session.isNew()){
resp.getWriter().write("session创建成功,ID:"+sessionId);
}else {
resp.getWriter().write("session以及在服务器中存在
了,ID:"+sessionId);
}
//Session创建的时候做了什么事情;
// Cookie cookie = new Cookie("JSESSIONID",sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
//得到Session
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();
以上是session的简单使用 ~~~~~