java Servlet笔记9

Servlet Cookie 处理

​ Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。

识别返回用户包括三个步骤:

  • 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
  • 浏览器将这些信息存储在本地计算机上,以备将来使用。
  • 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户

Servlet Cookie 处理需要对中文进行编码与解码,方法如下:

String   str   =   java.net.URLEncoder.encode("中文""UTF-8");            //编码
String   str   =   java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码

Cookie 剖析

Cookie 通常设置在 HTTP 头信息中,设置 Cookie 的 Servlet 会发送如下的头信息:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; 
                 path=/; domain=runoob.com
Connection: close
Content-Type: text/html

正如您所看到的,Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域。名称和值会被 URL 编码。expires 字段是一个指令,告诉浏览器在给定的时间和日期之后"忘记"该 Cookie。

如果浏览器被配置为存储 Cookie,它将会保留此信息直到到期日期。如果用户的浏览器指向任何匹配该 Cookie 的路径和域的页面,它会重新发送 Cookie 到服务器。浏览器的头信息可能如下所示:

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

Servlet Cookie 方法

Servlet 中操作 Cookie 时可使用的有用的方法列表。

序号方法 & 描述
1public void setDomain(String pattern) 该方法设置 cookie 适用的域,例如 runoob.com。
2public String getDomain() 该方法获取 cookie 适用的域,例如 runoob.com。
3public void setMaxAge(int expiry) 该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
4public int getMaxAge() 该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
5public String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。
6public void setValue(String newValue) 该方法设置与 cookie 关联的值。
7public String getValue() 该方法获取与 cookie 关联的值。
8public void setPath(String uri) 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
9public String getPath() 该方法获取 cookie 适用的路径。
10public void setSecure(boolean flag) 该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
11public void setComment(String purpose) 设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
12public String getComment() 获取 cookie 的注释,如果 cookie 没有注释则返回 null。

通过 Servlet 设置 Cookie

通过 Servlet 设置 Cookie 包括三个步骤:

  1. **创建一个 Cookie 对象:**您可以调用带有 cookie 名称和 cookie 值的 Cookie 构造函数,cookie 名称和 cookie 值都是字符串。
Cookie cookie = new Cookie("key","value");

无论是名字还是值,都不应该包含空格或以下任何字符:[ ] ( ) = , " / ? @ : ;

  1. **设置最大生存周期:**您可以使用 setMaxAge 方法来指定 cookie 能够保持有效的时间(以秒为单位)。下面将设置一个最长有效期为 24 小时的 cookie。
cookie.setMaxAge(60*60*24); 
  1. **发送 Cookie 到 HTTP 响应头:**您可以使用 response.addCookie 来添加 HTTP 响应头中的 Cookie,如下所示:
response.addCookie(cookie);

实例

public class HelloForm extends HttpServlet {
    private static final long serialVersionUID=1L;

    public HelloForm(){
        super();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //为姓名和姓氏创建Cookie
        Cookie name1=new Cookie("name", URLEncoder.encode(req.getParameter("name"),"UTF-8"));//中文转码
        Cookie url=new Cookie("url",req.getParameter("url"));
        //为两个cookie设置过期日期为24小时
        name1.setMaxAge(60*60*24);
        url.setMaxAge(60*60*24);

        //在响应头添加两个Cookie
        resp.addCookie(name1);
        resp.addCookie(url);

        //设置响应内容类型
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter out=resp.getWriter();
        String titile="cookie";

        //处理中文
        String name=new String(req.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
        String docType="<!DOCTYPE html \n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + titile + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + titile + "</h1>\n" +
                "<ul>\n" +
                "  <li><b>站点名</b>:"
                + name + "\n" +
                "  <li><b>网址</b>:"
                + req.getParameter("url") + "\n" +
                "</ul>\n" +
                "</body></html>");
    }
    //处理POST请求的方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

web.xml配置

<servlet>
    <servlet-name>HelloForm</servlet-name>
    <servlet-class>HelloForm</servlet-class>
</servlet>


<servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <url-pattern>/HelloForm</url-pattern>
</servlet-mapping>

hello.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>xxx</title>
</head>
<body>
<form action="HelloForm" method="POST">
    网址名:<input type="text" name="name">
    <br />
    网址:<input type="text" name="url" />
    <input type="submit" value="提交" />
</form>
</body>
</html>

通过 Servlet 读取 Cookie

要读取 Cookie,您需要通过调用 HttpServletRequestgetCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

实例

public class ReadCookies extends HttpServlet {
    private static final long seriaVersionUID=1L;

    public ReadCookies(){
        super();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie=null;
        Cookie[] cookies=null;
        //获取与该相关的Cookle的数组
        cookies =req.getCookies();
        //设置响应内容类型
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter out=resp.getWriter();
        String title="Delete Cookie Example";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
        if( cookies != null ){
            out.println("<h2>Cookie 名称和值</h2>");
            for (int i = 0; i < cookies.length; i++){
                cookie = cookies[i];
                if((cookie.getName( )).compareTo("name") == 0 ){
                    cookie.setMaxAge(0);
                    resp.addCookie(cookie);
                    out.print("已删除的 cookie:" +
                            cookie.getName( ) + "<br/>");
                }
                out.print("名称:" + cookie.getName( ) + ",");
                out.print("值:" +  URLDecoder.decode(cookie.getValue(), "utf-8") +" <br/>");
            }
        }else{
            out.println(
                    "<h2 class=\"tutheader\">No Cookie founds</h2>");
        }
        out.println("</body>");
        out.println("</html>");
    }
}

通过 Servlet 删除 Cookie

删除 Cookie 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:

  • 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
  • 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
  • 把这个 cookie 添加到响应头。

实例

@WebServlet("/DeleteCookies")
public class DeleteCookies extends HttpServlet {
    private static final long serialVersionUID=1L;

    public DeleteCookies(){
        super();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie=null;
        Cookie[] cookies=null;
        // 获取与该域相关的 Cookie 的数组
        cookies=req.getCookies();

        //设置响应内容类型
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter out=resp.getWriter();
        String title = "删除 Cookie 实例";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
        if( cookies != null ){
            out.println("<h2>Cookie 名称和值</h2>");
            for (int i = 0; i < cookies.length; i++){
                cookie = cookies[i];
                if((cookie.getName( )).compareTo("url") == 0 ){
                    cookie.setMaxAge(0);
                    resp.addCookie(cookie);
                    out.print("已删除的 cookie:" +
                            cookie.getName( ) + "<br/>");
                }
                out.print("名称:" + cookie.getName( ) + ",");
                out.print("值:" + cookie.getValue( )+" <br/>");
            }
        }else{
            out.println(
                    "<h2 class=\"tutheader\">No Cookie founds</h2>");
        }
        out.println("</body>");
        out.println("</html>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值