Session 与Cookie

来源:互联网 发布:眉笔推荐 知乎 编辑:程序博客网 时间:2024/05/20 17:26

cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据。

</pre><h2 style="margin: 15px 0px; padding: 5px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 20px; line-height: 35px; color: white; background-color: rgb(51, 153, 204);">一、:Cookie的发送和接收</h2><span style="font-family: Arial; font-size: 14px; line-height: 26px;">发送端代码,AServlet.java,通过addCookie(cookie)将我们预先设定的好的Cookie发送给浏览器</span><pre name="code" class="java">import java.io.IOException;  import java.net.URLEncoder;    import javax.servlet.ServletException;  import javax.servlet.http.Cookie;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  //演示发送cookie(头)到浏览器  public class AServlet extends HttpServlet {        public void doGet(HttpServletRequest request, HttpServletResponse response)              throws ServletException, IOException {          //明白原理的写法:          //response.setHeader("set-Cookie", "name=tom");          //使用封装好的代码          //创建cookie对象 => 封装键值对          Cookie cookie = new Cookie("name",URLEncoder.encode("汤姆","UTF-8"));          //将cookie添加到response中 => 添加响应头          response.addCookie(cookie);        }    }  
接收端代码,BServlet.java,打印时候分别打印编码值和其解码值

[java] view plain copy
 print?
  1. import java.io.IOException;  
  2. import java.net.URLDecoder;  
  3.   
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.Cookie;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. //演示取出浏览器发送过来的cookie  
  10. public class BServlet extends HttpServlet {  
  11.   
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  13.             throws ServletException, IOException {  
  14.         // 获得浏览器发送的所有cookie  
  15.         Cookie[] cookies = request.getCookies();      
  16.         Cookie nameCookie = null;  
  17.           
  18.         //遍历,找到我们要找的cookie  
  19.         if(cookies!=null){  
  20.             for(Cookie c : cookies){  
  21.                 if("name".equals(c.getName())){  
  22.                     //找到了  
  23.                     nameCookie = c;   
  24.                 }  
  25.                   
  26.             }  
  27.         }  
  28.         if(nameCookie!=null){  
  29.             System.out.println("浏览器发送的cookie==>" + nameCookie.getName()+":"+nameCookie.getValue());  
  30.             System.out.println("浏览器发送的cookie==>" + nameCookie.getName()+":"+URLDecoder.decode(nameCookie.getValue(), "UTF-8"));  
  31.         }else{  
  32.             System.out.println("没有找到namecookie");  
  33.         }  
  34.           
  35.           
  36.     }  
  37.   
  38. }  
          先执行AServlet,再执行BServlet,其打印结果如下

         

[java] view plain copy
 print?
  1. 浏览器发送的cookie==>name:%E6%B1%A4%E5%A7%86  
  2. 浏览器发送的cookie==>name:汤姆  

二:设置Cookie的有效时间和路径

   设置时间是按秒来计算的

[java] view plain copy
 print?
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.Cookie;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. public class CServlet extends HttpServlet {  
  10.   
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13.           
  14.         Cookie c = new Cookie("name","jerry");  
  15.           
  16.         //设置cookie的有效时间  
  17.             c.setMaxAge(60*60*24*7*2);//告诉浏览器保存2周  
  18.             //c.setMaxAge(-1);// -1代表 在会话结束时删除cookie(默认情况)  
  19.             //c.setMaxAge(0);// 通常用于删除已经存在的cookie.使用一个寿命为0的cookie,覆盖要删除的cookie  
  20.               
  21.             //设置Cookie的路径  
  22.             c.setPath("/day09-cookie/ABC");  
  23.         response.addCookie(c);    
  24.     }  
  25. }  

三、:通过Cookie显示浏览历史

1、首先需要有一个jsp的交互展示页面list.jsp

[html] view plain copy
 print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.     <title>My JSP 'index.jsp' starting page</title>  
  12.     <meta http-equiv="pragma" content="no-cache">  
  13.     <meta http-equiv="cache-control" content="no-cache">  
  14.     <meta http-equiv="expires" content="0">      
  15.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  16.     <meta http-equiv="description" content="This is my page">  
  17.     <!-- 
  18.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  19.     -->  
  20.   </head>  
  21.     
  22.   <body>  
  23.    <a href="/day09-cookie/EServlet?name=dell" >dell</a><br>  
  24.    <a href="/day09-cookie/EServlet?name=lenovo" >lenovo</a><br>  
  25.    <a href="/day09-cookie/EServlet?name=hasee" >hasee</a><br>  
  26.    <a href="/day09-cookie/EServlet?name=hp" >hp</a><br>  
  27.    <a href="/day09-cookie/EServlet?name=apple" >apple</a><br>  
  28.    <a href="/day09-cookie/EServlet?name=acer" >acer</a><br>  
  29.      
  30.    浏览历史:${cookie.history.value}  
  31.   </body>  
  32. </html>  
2、编写一个CookieUtils.java的工具类来遍历Cookie数组

[java] view plain copy
 print?
  1. package cn.itcast.f_history;  
  2.   
  3. import javax.servlet.http.Cookie;  
  4. import javax.servlet.http.HttpServletRequest;  
  5.   
  6. public class CookieUtils {  
  7.     // 通过名字获得cookie,通过遍历一个cookie数组来获得对应名字的cookie  
  8.     public static Cookie getCookieByName(HttpServletRequest request,String name){  
  9.         Cookie cookie  = null;  
  10.           
  11.         Cookie[] cookies = request.getCookies();  
  12.           
  13.         if(cookies!=null){  
  14.             for(Cookie c: cookies){  
  15.                 if(name.equals(c.getName())){  
  16.                     cookie = c;  
  17.                 }  
  18.             }  
  19.         }  
  20.           
  21.         return cookie;  
  22.     }   
  23. }  
3、接收到Cookie并处理,Cookie名字叫history,如果history没有的话再加上对应的品牌

[java] view plain copy
 print?
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.Cookie;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. public class EServlet extends HttpServlet {  
  10.   
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13. //      1.获得参数  
  14.             String name  = request.getParameter("name");  
  15. //      2.获得Cookie  
  16.             Cookie history = CookieUtils.getCookieByName(request, "history");  
  17.             if(history!=null){  
  18. //          //存在 => 修改cookie加上现在浏览器的品牌 => dell,hp,lenvo  
  19.                 if(!history.getValue().contains(name)){  
  20.                 history = new Cookie("history",history.getValue()+","+name);  
  21.                 }  
  22.             }else{  
  23. //          //不存在 => 创建cookie  
  24.                 history = new Cookie("history",name);  
  25.             }  
  26. //      3.将cookie发送会浏览器  
  27.             response.addCookie(history);  
  28. //      4.重定向到列表页面  
  29.             response.sendRedirect("/day09-cookie/history/list.jsp");  
  30.     }  
  31.   
  32. }  

四、:通过Cookie记住用户名

1、首先也是需要一个login.jsp,其中最为关键的是checkbox中的当cookie.remember不等于null时,checked=checked,也就是返回一个yes

[html] view plain copy
 print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'login.jsp' starting page</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!-- 
  20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  21.     -->  
  22.   
  23.   </head>  
  24.     
  25.   <body>  
  26.   <form action="/day09-cookie/FServlet"  >  
  27.         用户名:<input type="text" name="name" value="${cookie.remember.value}" />  
  28.         <font color="red">${requestScope.error}</font>  
  29.         <br>  
  30.         密码:<input type="text" name="password" /><br>  
  31.         <input type="checkbox" name="remember" value="yes" ${cookie.remember==null?"":"checked=checked"} />记住用户名<br>  
  32.         <input type="submit" value="登录" />  
  33.     </form>  
  34.   </body>  
  35. </html>  
2、创建Cookie,添加要需要保存的用户名

[java] view plain copy
 print?
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.Cookie;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. public class FServlet extends HttpServlet {  
  10.   
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13. //      1.获得用户名密码  
  14.         String  name  = request.getParameter("name");  
  15. //      2.校验用户名密码  
  16.         if(name==null || "".equals(name.trim())){  
  17. //          //失败=> 转发到表单页面,并提示错误  
  18.   
  19.             //给request添加error属性,属性叫做“请输入用户名”  
  20.             request.setAttribute("error""请输入用户名!");  
  21.             request.getRequestDispatcher("/remember/login.jsp").forward(request, response);  
  22.             return;  
  23.         }  
  24. //      3.创建cookie 添加要保存的用户名,  
  25.         Cookie c = new Cookie("remember", name);  
  26. //      4.查看记住用户名是否被选中  
  27.         String remember = request.getParameter("remember");  
  28.         if("yes".equals(remember)){  
  29. //          选中 => 设置保存时间为2周  
  30.             c.setMaxAge(60*60*24*7*2);  
  31.         }else{  
  32. //          //没选中=>设置保存事件为0  
  33.             c.setMaxAge(0);  
  34.         }  
  35. //      5.添加到响应中  
  36.         response.addCookie(c);  
  37. //      6.重定向到成功页面  
  38.         response.sendRedirect("/day09-cookie/index.jsp");  
  39.     }  
  40.       
  41.   
  42.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  43.             throws ServletException, IOException {  
  44.         doGet(request, response);  
  45.     }  
  46.   
  47. }  
[java] view plain copy
 print?
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.Cookie;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. public class FServlet extends HttpServlet {  
  10.   
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13. //      1.获得用户名密码  
  14.         String  name  = request.getParameter("name");  
  15. //      2.校验用户名密码  
  16.         if(name==null || "".equals(name.trim())){  
  17. //          //失败=> 转发到表单页面,并提示错误  
  18.   
  19.             //给request添加error属性,属性叫做“请输入用户名”  
  20.             request.setAttribute("error""请输入用户名!");  
  21.             request.getRequestDispatcher("/remember/login.jsp").forward(request, response);  
  22.             return;  
  23.         }  
  24. //      3.创建cookie 添加要保存的用户名,  
  25.         Cookie c = new Cookie("remember", name);  
  26. //      4.查看记住用户名是否被选中  
  27.         String remember = request.getParameter("remember");  
  28.         if("yes".equals(remember)){  
  29. //          选中 => 设置保存时间为2周  
  30.             c.setMaxAge(60*60*24*7*2);  
  31.         }else{  
  32. //          //没选中=>设置保存事件为0  
  33.             c.setMaxAge(0);  
  34.         }  
  35. //      5.添加到响应中  
  36.         response.addCookie(c);  
  37. //      6.重定向到成功页面  
  38.         response.sendRedirect("/day09-cookie/index.jsp");  
  39.     }  
  40.       
  41.   
  42.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  43.             throws ServletException, IOException {  
  44.         doGet(request, response);  
  45.     }  
  46.   
  47. }

五、:Session简单介绍

session其实指的就是访问者从到达某个特定主页到离开为止的那段时间。 Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。

[java] view plain copy
 print?
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7. import javax.servlet.http.HttpSession;  
  8.   
  9. public class AServlet extends HttpServlet {  
  10.   
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13.             //参数类型是boolean型  
  14.             //true=> 无论如何都要获得session  
  15.             //false => 如果没有sessionID ,不会获得session  
  16.             //request.getSession(true);  
  17.         HttpSession session =  request.getSession();//相当于上面的方法 填写true  
  18.       
  19.             //session 的操作  
  20. //      session.setAttribute(arg0, arg1)  
  21. //      session.getAttribute(arg0)  
  22. //      session.getAttributeNames()  
  23. //      session.removeAttribute(arg0)  
  24.             //session中可以存放登录状态  
  25.     }  
  26.   
  27. }  
        Session中的一些方法

          

[java] view plain copy
 print?
  1. import java.io.IOException;  
  2. import java.util.Date;  
  3.   
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.servlet.http.HttpSession;  
  9.   
  10. public class BServlet extends HttpServlet {  
  11.   
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  13.             throws ServletException, IOException {  
  14.           
  15.         HttpSession session = request.getSession();  
  16.           
  17.         System.out.println("session.isNew()"+session.isNew());// 判断session是否 是新的.  
  18.         System.out.println("session.getCreationTime()"+new Date(session.getCreationTime()));//获得session的创建时间  
  19.         System.out.println("session.getId()"+session.getId());//获得session的id  
  20.         System.out.println("session.getLastAccessedTime()"+new Date(session.getLastAccessedTime()));//获得最后一次的访问时间  
  21.         System.out.println("session.getMaxInactiveInterval()"+session.getMaxInactiveInterval());// 获得session的最大有效时间  
  22.         //session.setMaxInactiveInterval(60);//设置session的最大有效时间为60秒  
  23.         session.invalidate();//*** 立即让session销毁.  
  24.     }  
  25.   
  26. }  

   六、:Cookie和Session区别

(1)Cookie数据存放在客户的浏览器上,session数据放在服务器上


(2)Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,如果主要考虑到安全应当使用session


(3)Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用Cookie


(4)单个Cookie在客户端的限制是3K,就是说一个站点在客户端存放的Cookie不能3K。


(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在Cookie中



    

0 0
原创粉丝点击