Cookie与Session的详析
1. 会话
概念:会话是浏览器和服务器之间的多次请求和响应。即从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话
有状态会话:
小例子:你怎么证明你是北大的学生?
你 北大
- 发票 北大给你发票
- 学校登记 北大标记你来过了
同理,一个网站,如何证明你来过
客户端 服务端
1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了; cookie
2. 服务器登记你来过了,下次你再来的时候,我来匹配你; session
2. 保存会话的两种技术
cookie——客户端会话技术
session——服务器会话技术
常见:网站登录之后,下次不用再登陆,而是直接就有了!
3. Cookie技术
-
从请求中拿到cookie信息
-
服务器响应给客户端cookie
// 设置请求和响应的字符集格式,避免中文乱码问题 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); //告诉浏览器,服务器发送的消息体的数据的编码 resp.setHeader("content-type","text/html;charset=utf-8"); //中文输出乱码问题,上一行的代码就是解决这个问题的 PrintWriter out = resp.getWriter(); // Cookie,服务器从客户端获取 Cookie[] cookies = req.getCookies(); //这里返回的是数组,说明cookie可能存在多个 //判断cookie是否存在 if(cookies!=null){ //如果存在 out.write("您上次访问的时间是:"); //第一种遍历方式 // for (Cookie cookie : cookies) { // // 获取Cookie的名字 // if(cookie.getName().equals("lastLoginTime")){ // //获取cookie中的值 // cookie.getValue(); // } // } //第二次遍历方式(更灵活,因为可以任取下标) for (int i = 0; i <cookies.length; i++) { Cookie cookie = cookies[i]; // 获取cookie的名字 if(cookie.getName().equals("lastLoginTime")){ //获取cookie中的值 long lastLoginTime = Long.parseLong(cookie.getValue()); Date date = new Date(lastLoginTime); out.write(date.toLocaleString()); } } }else{ out.write("这是您第一次访问本站"); } // 服务端给客户端响应一个cookie Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); // 设置cookie有效期为一天 cookie.setMaxAge(60*60*24); resp.addCookie(cookie);
**cookie:一般保存在本地的用户目录下的AppData **
一个网站cookie是否存在上限?聊聊细节问题
* 一个web站点可以给浏览器发送多个cookie * Cookie大小有限制4kb * 300个cookie浏览器上限
(1) 注意:
Cookie具有不可跨域名性
ookie保存中文乱码问题:中文属于Unicode字符,英文数据Ascii字符,中文占4个字符或者3个字符,英文占2个字符,Cookie使用Unicode字符时需要对Unicode字符进行编码
Cookie cookie = new Cookie("xxx",URLEncoder.encode(name,"UTF-8"))
删除Cookie的两种方式
- 不设置有效期,关闭浏览器后,cookie自动删除
- 设置有效期时间为0
注意:在传输编程中,字符传输需要解码编码
当req.setCharacterEncoding(“utf-8”);
resp.setCharacterEncoding(“utf-8”); 不起作用时,
比较好的解决方式
// 解码 URLDecoder.decode(); // 编码 URLEncoder.encode();
4. Session(重点)
什么是Session:
-
服务器会给每一个用户(浏览器)创建一个Session对象;
-
一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就在存在;
-
用户登录之后,整个网站它都可以访问!–> 保存用户的信息
比如:保存购物车的信息…
Session和cookie的区别:
* Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
* Session把用户的数据写到用户独占Session中,服务端保存(保存重要的信息,减少服务器资源的浪费)
* Session对象由服务创建
使用场景:
* 保存一个登录用户的信息;
* 购物车信息;
* 在整个网站中经常会使用的数据,我们将它保存在Session中;
使用Session:
@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","秦疆");
//获取Session的ID
String id = session.getId();
//判断Session是不是新的创建
if (session.isNew()) {
resp.getWriter().write("session创建成功了,ID: "+id);
}else{
resp.getWriter().write("session以及在服务器中存在了,ID: "+id);
}
//Session创建的时候做了什么事情
//Cookie cookie = new Cookie("JSESSIONID",id);
//resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@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();
String name = (String) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
会话自动过期:web.xml配置
<!-- 设置Session默认的失效时间 -->
<session-config>
<!-- 15分钟后Session自动失效,以分钟为单位 -->
<session-timeout>15</session-timeout>
</session-config>