Servlet操作cookie

java Servlet对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题。

Java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题。建立一个无生命周期的cookie,即随着浏览器的关闭即消失的cookie,代码如下:

Cookie cookie = new Cookie("cookiename","cookievalue");
response.addCookie(cookie);

下面建立一个有生命周期的cookie,可以设置他的生命周期

cookie = new Cookie("cookiename","cookievalue");
cookie.setMaxAge(3600);

设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问

cookie.setPath("/");
response.addCookie(cookie);

下面介绍如何读取cookie,读取cookie代码如下:

// 这样便可以获取一个cookie数组
Cookie[] cookies = request.getCookies();
for ( Cookie cookie : cookies ) {
    cookie.getName(); // get the cookie name
    cookie.getValue(); // get the cookie value
}

设置Cookie

Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(60);
cookie.setPath("/test/test2");
response.addCookie(cookie);

说明:

(1)setMaxAge用来设置cookie的生存周期。如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。上面方法设置cookie在60秒后过期。

(2)setPath方法用来设置Cookie路径。如果不设置路径,则为当前路径。对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分。

读取Cookie

该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null。

Cookie[] cookies = request.getCookies();

删除Cookie

// 上面删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie;
Cookie cookie = new Cookie("key", null);
cookie.setMaxAge(0);
cookie.setPath("/test/test2");
response.addCookie(cookie);

注意:cookie不能直接别删除,我们要删除cookie,只要将生命周期设置为0就是,但是不能设置为小于0的值,因为-1表示其他意思。

下面用一个完整的实例来说明

<%@ page contentType="text/html; charset=utf-8"
    language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
    <title>cookie测试</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<%
    String username = null;
    Cookie[] cookies = request.getCookies();
    if ( cookies != null ) {
        for ( int i = 0; i < cookies.length; i ++ ) {
            if( "cookies_user".equals(cookies[i].getName()) ) {
                username = cookies[i].getValue();
            }
        }
        
        if ( "onepc".equals(username) ) {
            out.println("Hello");
        } else {
%>
    <table width="302" border="1">
        <form id="form1" name="form1" method="post" action="clogin.jsp">
        <tr>
            <td width="79">
                <div align="center"></div>
            </td>
            <td width="207">
                <input type="text" name="user" id="user" />
            </td>
        </tr>
        <tr>
            <td>
                <div align="center"></div>
            </td>
            <td>
                <input type="text" name="textfield2" id="textfield2" />
            </td>
        </tr>
        <tr>
            <td>
                <div align="center"></div>
            </td>
            <td>
                <select name="select" id="select">
                    <option value="31536000">one year</option>
                    <option value="120">two min</option>
                </select>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <label>
                <input type="submit" name="button" id="button" value="" />
                </label>
            </td>
        </tr>
        </form>
    </table>
<%
        }
    }
%>
</body>
</html>
login.jsp
<%
    String user = request.getParameter("user");
    Cookie cookie = new Cookie("cookies_user",user);
    cookie.setMaxAge(120);
    response.addCookie(cookie);
    response.sendRedirect("cindex.jsp");
%>

test/test2/test345/test555/test666

a)相同名称的Cookie可以存在于不同的路径下。

b)删除时,如果当前路径下没有指定名称的Cookie,则查询全部父路径,检索到就执行删除操作(每次只能删除一个与自己最近的父路径Cookie)。

    FF、必须指定与设定cookie时使用的相同路径来删除该cookie,而且cookie的名称不论大写、小写或大小混合都要指定路径

    IE、名称小写时,如果当前路径为/test/test2,如果找不到再向上查询/test、/test555、/test345,如果还找不到就查询/(/test555/test666不查询) 。键名大小写混合或大写时,不指定路径则默认删除当前路径,并且不向上查询。

c)读取Cookie时只能读取直接父路径的Cookie。如果当前路径为/test/test2,要读取的键为“key”。当前路径读取后,还要读取/test,/test读取后,还要读取/ 。

d)在做Java的web项目时,由于一般的Web服务器(如Tomcat或Jetty)都用Context来管理不同的Web Application,这样对于每个Context有不同的Path,在一个Server中有多个Web Application时要特别小心,不要设置Path为/的Cookie,容易误操作(当然前提是域名相同)。

不是每一次努力都有收获,但是,每一次收获都必须努力。
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号