JavaWeb学习——Cookie与JSP
一、Cookie简介
Cookie 指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据。
Cookie 是由 Web 服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息。
Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时 间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分 为非持久Cookie和持久Cookie。
二、Cookie的常用方法
方法 | 描述 |
Cookie(String name, String value) | 实例化对象,传入cookie的名称和值 |
public String getName() | 获取Cookie对象的名称 |
public String getValue() | 获取Cookie对象的值 |
public void setValue(String value) | 设置Cookie的值 |
public void setMaxAge(int expiry) | 设置Cookie的有效期,如果不设置,有效期为一次对话。 |
public int getMaxAge() | 获取Cookie的有效期 |
public void setPath(String url) | 设置Cookie的有效路径,即访问url之外的资源检测不到这个cookie |
public String getPath() | 获取Cookie的有效路径 |
public void setDomain(String pattern) | 设置Cookie的有效域,多个网站可以使用一个Cookie |
public Strinng getDomain() | 获取Cookie的有效域 |
response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取 客户端提交的Cookie。
三、实例(用户登录)
以Cookie来保存用户登录的用户名和密码:
1 <!-- login.jsp--> 2 <html> 3 <body> 4 <% 5 String username="", password=""; //创建两个存储username和password的对象 6 7 Cookie[] cookies = request.getCookies(); //获取客户端保存的cookie数组 8 if(cookies!=null&&cookies.length>0){ //检测cookies是否为空 9 for(Cookie c: cookies){ 10 if(c.getName().equals("username")){ 11 username = URLDecoder.decode(c.getValue(),"utf-8"); //获取cookies中的中文数据,需要使用URLDecoder类的decode方法进行中文解码 12 } 13 if(c.getName().equals("password")){ 14 password = URLDecoder.decode(c.getValue(),"utf-8"); 15 } 16 } 17 } 18 %> 19 <h1>用户登录</h1> 20 <%@include file="date.jsp"%><%--include指令 --%> 21 <jsp:include page="date.jsp" flush="false" /> <%--include动作 --%> 22 <hr> 23 <form action="doLogin.jsp" name="LoginForm" method="post"> 24 <table> 25 <tr> 26 <td>用户名:</td> 27 <td><input type="text" name="username" value="<%=username %>"></td> 28 </tr> 29 <tr> 30 <td>密码:</td> 31 <td><input type="password" name="password" value="<%=password %>"></td> 32 </tr> 33 <tr> 34 <td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked">是否保存用户信息</td> 35 </tr> 36 <tr> 37 <td colspan="2" text-align="center"><input type="submit" value="登录"></tr> 38 </tr> 39 </table> 40 </form> 41 </body> 42 </html>
<!-- doLogin.jsp --> <html> <body> <% request.setCharacterEncoding("utf-8"); String[] isUseCookies = request.getParameterValues("isUseCookie"); //首先判断用户是否选择保存信息 if(isUseCookies!=null&&isUseCookies.length>0){ //使用URLEncoder类中的encoder方法解决中文乱码问题 String username = URLEncoder.encode(request.getParameter("username"),"utf-8"); String password = URLEncoder.encode(request.getParameter("password"),"utf-8"); Cookie usernameCookie = new Cookie("username",username); //创建Cookie Cookie passwordCookie = new Cookie("password",password); usernameCookie.setMaxAge(86400); //设置Cookie最大有效期 passwordCookie.setMaxAge(86400); response.addCookie(usernameCookie); //写入Cookie response.addCookie(passwordCookie); }else{ Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0){ for(Cookie c: cookies){ if(c.getName().equals("username")||c.getName().equals("password")){ c.setMaxAge(0); //设置cookie失效 response.addCookie(c); //重新保存 } } } } %> <h1>登陆成功</h1> <hr> <a href="users.jsp">点击查看用户信息</a> </body> </html>
四、Cookie与Session对比
Cookie | Session | |
存储位置 | 在客户端保存用户信息 | 在服务器端保存用户信息 |
数据类型 | 保存类型是String | 保存类型是Object |
有效期 | 长期保存在客户端 | 随会话结束而销毁 |
信息安全 | 保存不重要信息 | 保存重要信息 |
五、Cookie的缺陷
- Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
- 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
- Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。
--- 每天积累一点点,吃水不忘挖井人 ---