Cookie的使用

转自: https://blog.csdn.net/u011024652/article/details/52015784

一、HTTP协议的无状态性

因为HTTP协议是无状态的,也就是说当用户发送一次请求给服务器之后,服务器响应客户端的请求,当同一个客户端再次发送请求给服务器时,服务器并不知道这个请求是同一个客户端发送的。而要保存用户的状态,涉及到两种技术,Session和Cookie,其中Session是保存在服务器端的,会随着会话的结束而销毁,而Cookie保存在客户端,可以保存较长一段时间,但是就因为Cookie保存在客户端,因此有不安全的风险。

二、JSP中Cookie的使用

JSP中的涉及到Cookie常见的使用有以下几种:

Cookie cookie = new Cookie(String key, String value)创建一个新的Cookie对象
response.addCookie(cooke)写入Cookie对象
Cookie[] cookies = request.getCookies()读取Cookie对象
void setMaxAge(int expiry)设置Cookie有效期,以秒为单位
void setValue(String value)Cookie创建后,对Cookie进行赋值
String getName()获取Cookie名称
String getValue()获取Cookie的值
int getMaxAge()获取Cookie的有效时间,以秒为单位
下面通过一个实例来介绍Cookie这些方法的使用。主要功能是用户登录,在用户登录时提示用户是否记住登录信息,当用户选择记住登录信息时,会将用户的登录信息保存在Cookie中,以后用户再进入登录页面时会自动为用户写入用户的登录信息。

首先写一个登录页面login.jsp,里面涉及一个表单包含用户名和密码,同时让用户选择是否记住用户名密码,并检查用户的Cookie,看是否有用户的登录信息,如果有的话直接将Cookie中的信息填入登录页面中的相应位置。

  1. <%@ page language=“java” import=“java.net.*” contentType=“text/html; charset=UTF-8”  
  2.     pageEncoding=”UTF-8”%>  
  3. <!DOCTYPE html PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>  
  4. <html>  
  5. <head>  
  6. <meta http-equiv=”Content-Type” content=“text/html; charset=UTF-8”>  
  7. <title>登录</title>  
  8. </head>  
  9. <body>  
  10.     <h1>请登录</h1>  
  11.     <hr/>  
  12.     <%  
  13.         request.setCharacterEncoding(”UTF-8”);  
  14.           
  15.         String userName = ”“;  
  16.         String password = ”“;  
  17.           
  18.         //获取cookie对象  
  19.         Cookie[] cookies = request.getCookies();  
  20.         if(null != cookies && cookies.length > 0) {  
  21.             for(Cookie c : cookies) {  
  22.                 if(“userName”.equals(c.getName())) {  
  23.                     //为了防止读取到的cookie值为乱码,  
  24.                     //将cookie的值使用URLDecoder.decode(String str, String encoding)进行转码  
  25.                     userName = URLDecoder.decode(c.getValue(), ”UTF-8”);  
  26.                 } else if(“password”.equals(c.getName())) {  
  27.                     password = URLDecoder.decode(c.getValue(), ”UTF-8”);  
  28.                 }  
  29.             }  
  30.         }  
  31.     %>  
  32.     <form action=”dologin.jsp” action=“post”>  
  33.         <table>  
  34.             <tr>  
  35.                 <td>用户名:</td>  
  36.                 <td><input type=”text” name=“userName” value=“<%=userName %>” /></td>  
  37.             </tr>  
  38.             <tr>  
  39.                 <td>密码:</td>  
  40.                 <td><input type=”password” name=“password” value=“<%=password %>” /></td>  
  41.             </tr>  
  42.             <tr>  
  43.                 <td colspan=”2”><input type=“checkbox” name=“isRemeber” value=“remeber” checked=“checked”>十天内免登录</td>  
  44.             </tr>  
  45.             <tr>  
  46.                 <td colspan=”2”><input type=“submit” value=“登录”></td>  
  47.             </tr>  
  48.         </table>  
  49.     </form>  
  50. </body>  
  51. </html>  
<%@ page language="java" import="java.net.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
    <h1>请登录</h1>
    <hr/>
    <%
        request.setCharacterEncoding("UTF-8");

        String userName = "";
        String password = "";

        //获取cookie对象
        Cookie[] cookies = request.getCookies();
        if(null != cookies && cookies.length > 0) {
            for(Cookie c : cookies) {
                if("userName".equals(c.getName())) {
                    //为了防止读取到的cookie值为乱码,
                    //将cookie的值使用URLDecoder.decode(String str, String encoding)进行转码
                    userName = URLDecoder.decode(c.getValue(), "UTF-8");
                } else if("password".equals(c.getName())) {
                    password = URLDecoder.decode(c.getValue(), "UTF-8");
                }
            }
        }
    %>
    <form action="dologin.jsp" action="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="userName" value="<%=userName %>" /></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password" value="<%=password %>" /></td>
            </tr>
            <tr>
                <td colspan="2"><input type="checkbox" name="isRemeber" value="remeber" checked="checked">十天内免登录</td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="登录"></td>
            </tr>
        </table>
    </form>
</body>
</html>
在这个页面中我们看到取出Cookie中保存的内容时用到了一个URLDecoder.decode(String str, String encoding)方法,这是因为根据RFC 2109中的规定,在Cookie中只能包含ASCII的编码,中文很显然不是ASCII编码的,为了防止出现乱码,需要进行一次转码,而要将中文存入Cookie的方法将在下面看到。

用户在登录页面写入相关信息并提交之后交给dologin.jsp进行处理,主要是根据用户的选择判断是否将用户的登录信息存入Cookie中,如果需要,则将登录信息写入Cookie。

  1. <%@ page language=“java” import=“java.net.*” contentType=“text/html; charset=UTF-8”  
  2.     pageEncoding=”UTF-8”%>  
  3. <!DOCTYPE html PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>  
  4. <html>  
  5. <head>  
  6. <meta http-equiv=”Content-Type” content=“text/html; charset=UTF-8”>  
  7. <title>登录成功</title>  
  8. </head>  
  9. <body>  
  10.     <h1>登录成功</h1>  
  11.     <hr/>  
  12.     <%  
  13.         request.setCharacterEncoding(”UTF-8”);  
  14.           
  15.         String userName = ”“;  
  16.         String password = ”“;  
  17.         String[] isRemeber = request.getParameterValues(”isRemeber”);  
  18.           
  19.         if(null != isRemeber && isRemeber.length > 0) {  
  20.             //获取userName和password的值,为了防止给cookie赋值时出现乱码异常,  
  21.             //使用URLEncoder.encode(String str, String encoding)转码  
  22.             userName = URLEncoder.encode(request.getParameter(”userName”), “UTF-8”);  
  23.             password = URLEncoder.encode(request.getParameter(”password”), “UTF-8”);  
  24.               
  25.             //定义cookie  
  26.             Cookie userNameCookie = new Cookie(“userName”, userName);  
  27.             Cookie passwordCookie = new Cookie(“password”, password);  
  28.               
  29.             //设置cookie的有效时间  
  30.             userNameCookie.setMaxAge(60 * 60 * 24 * 10);  
  31.             passwordCookie.setMaxAge(60 * 60 * 24 * 10);  
  32.               
  33.             //写入cookie对象  
  34.             response.addCookie(userNameCookie);  
  35.             response.addCookie(passwordCookie);  
  36.         } else {  
  37.             Cookie[] cookies = request.getCookies();  
  38.             if(null != cookies && cookies.length > 0) {  
  39.                 for(Cookie c : cookies) {  
  40.                     if(“userName”.equals(c.getName()) || “password”.equals(c.getName())) {  
  41.                         c.setMaxAge(0);  
  42.                         response.addCookie(c);  
  43.                     }  
  44.                 }  
  45.             }  
  46.         }  
  47.     %>  
  48.       
  49.     <a href=”testCookie.jsp”>测试Cookie是否保存</a>  
  50. </body>  
  51. </html>  
<%@ page language="java" import="java.net.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功</title>
</head>
<body>
    <h1>登录成功</h1>
    <hr/>
    <%
        request.setCharacterEncoding("UTF-8");

        String userName = "";
        String password = "";
        String[] isRemeber = request.getParameterValues("isRemeber");

        if(null != isRemeber && isRemeber.length > 0) {
            //获取userName和password的值,为了防止给cookie赋值时出现乱码异常,
            //使用URLEncoder.encode(String str, String encoding)转码
            userName = URLEncoder.encode(request.getParameter("userName"), "UTF-8");
            password = URLEncoder.encode(request.getParameter("password"), "UTF-8");

            //定义cookie
            Cookie userNameCookie = new Cookie("userName", userName);
            Cookie passwordCookie = new Cookie("password", password);

            //设置cookie的有效时间
            userNameCookie.setMaxAge(60 * 60 * 24 * 10);
            passwordCookie.setMaxAge(60 * 60 * 24 * 10);

            //写入cookie对象
            response.addCookie(userNameCookie);
            response.addCookie(passwordCookie);
        } else {
            Cookie[] cookies = request.getCookies();
            if(null != cookies && cookies.length > 0) {
                for(Cookie c : cookies) {
                    if("userName".equals(c.getName()) || "password".equals(c.getName())) {
                        c.setMaxAge(0);
                        response.addCookie(c);
                    }
                }
            }
        }
    %>

    <a href="testCookie.jsp">测试Cookie是否保存</a>
</body>
</html>
在这里可以看到为了防止将数据存入Cookie中出现乱码,使用了URLEncoder.encode(String str, String encoding)进行转码。在这个页面中还添加了一个超链接,用于检查是否将用户信息存入了Cookie。下面写这个testCookie.jsp,用于读取用户的登录信息。

  1. <%@ page language=“java” import=“java.net.*” contentType=“text/html; charset=UTF-8”  
  2.     pageEncoding=”UTF-8”%>  
  3. <!DOCTYPE html PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>  
  4. <html>  
  5. <head>  
  6. <meta http-equiv=”Content-Type” content=“text/html; charset=UTF-8”>  
  7. <title>测试Cookie</title>  
  8. </head>  
  9. <body>  
  10.     <h1>用户信息</h1>  
  11.     <hr/>  
  12.     <%  
  13.         request.setCharacterEncoding(”UTF-8”);  
  14.           
  15.         String userName = ”“;  
  16.         String password = ”“;  
  17.           
  18.         Cookie[] cookies = request.getCookies();  
  19.         if(null != cookies && cookies.length > 0) {  
  20.             for(Cookie c : cookies) {  
  21.                 if(“userName”.equals(c.getName())) {  
  22.                     userName = URLDecoder.decode(c.getValue(), ”UTF-8”);  
  23.                 } else if(“password”.equals(c.getName())) {  
  24.                     password = URLDecoder.decode(c.getValue(), ”UTF-8”);  
  25.                 }  
  26.             }  
  27.         }  
  28.     %>  
  29.     用户名:<%=userName %><br/>  
  30.     密码:<%=password %><br/>  
  31. </body>  
  32. </html>  
<%@ page language="java" import="java.net.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试Cookie</title>
</head>
<body>
    <h1>用户信息</h1>
    <hr/>
    <%
        request.setCharacterEncoding("UTF-8");

        String userName = "";
        String password = "";

        Cookie[] cookies = request.getCookies();
        if(null != cookies && cookies.length > 0) {
            for(Cookie c : cookies) {
                if("userName".equals(c.getName())) {
                    userName = URLDecoder.decode(c.getValue(), "UTF-8");
                } else if("password".equals(c.getName())) {
                    password = URLDecoder.decode(c.getValue(), "UTF-8");
                }
            }
        }
    %>
    用户名:<%=userName %><br/>
    密码:<%=password %><br/>
</body>
</html>
全部写完后,运行程序,可以发现当用户填写了登录信息并选择保存十天后,信息被存在Cookie中,当用户关闭了浏览器,然后在Cookie的有效期内在进入登录页面时,页面会自动填入用户的登录信息。




                </div>
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值