标签:java cookie jsp cookies session
首先Cookies是存储在客户机的文本文件,它们保存了大量用户信息。
从Cookie的源码可以看出它实现了Cloneable接口,
以下是Cookie的构造方法,可以看出它是以键值对的形式存放的
public Cookie(String name, String value) { if (!isToken(name) || name.equalsIgnoreCase("Comment") // rfc2019 || name.equalsIgnoreCase("Discard") // 2019++ || name.equalsIgnoreCase("Domain") || name.equalsIgnoreCase("Expires") // (old cookies) || name.equalsIgnoreCase("Max-Age") // rfc2019 || name.equalsIgnoreCase("Path") || name.equalsIgnoreCase("Secure") || name.equalsIgnoreCase("Version") || name.startsWith("$") ) { String errMsg = lStrings.getString("err.cookie_name_is_token"); Object[] errArgs = new Object[1]; errArgs[0] = name; errMsg = MessageFormat.format(errMsg, errArgs); throw new IllegalArgumentException(errMsg); } this.name = name; this.value = value; }其中可以看出有一个isToken()方法,此方法的作用是什么呢,从源码中可以看出此方法用于比较确定此处的name是否为预留的关键字,如果是则返回false,就在cookie的构造方法之中就会抛出异常;不是预留关键字,则调用此构造函数。
private boolean isToken(String value) { int len = value.length(); for (int i = 0; i < len; i++) { char c = value.charAt(i); if (c < 0x20 || c >= 0x7f || tspecials.indexOf(c) != -1) return false; } return true; }那信息传输过程中,cookie是存放在http响应头之中,在jsp中设置一个cookie信息需要将如下信息发送给服务器
HTTP/1.1 200 OK Date: Fri, 04 Feb 2014 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=xyz; expires=Friday, 14-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.com Connection: close Content-Type: text/html如果浏览器被配置成可存储cookies,那么它将会保存这些信息直到过期。如果用户访问的任何页面匹配了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
那么我们在jsp中是如何创建和使用cookie的呢
1)创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。
2) 设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
3) 将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP响应头中添加cookies。
下面是一个保存用户名和密码的信息到cookie之中的代码
web.xml(web程序的人口之处)
<servlet> <servlet-name>Cookie</servlet-name> <servlet-class>com.qzp.servlet.cookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Cookie</servlet-name> <url-pattern>/cookie</url-pattern> </servlet-mapping>
cookieTest.jsp
<body> <form action="cookie" method="post"> 用户名:<input type="text" name="name" > 密码:<input type="password" name="password" > <input type="submit" value="登陆"> </form> </body>
public class cookieServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String name=req.getParameter("name"); String password=req.getParameter("password"); //以键值对的形式存放 Cookie cookie1=new Cookie("username",name); Cookie cookie2=new Cookie("psw",password); //设置过期时间为24小时 cookie1.setMaxAge(60*60*24); cookie2.setMaxAge(60*60*24); // 在响应头部添加cookie resp.addCookie(cookie1); resp.addCookie( cookie2 ); req.getRequestDispatcher("cookieResult.jsp").forward(req, resp); } }cookieResult.jsp,通过一个el表达式来获取cookie的值,其格式是${ cookie. 键. value}(如果对EL表达式不是很熟悉的话,可以看我接下来的教程)
<body> <center> <h1>result</h1> </center> <ul> <li><p> <b>name:</b> ${cookie.username.value} </p> </li> <li><p> <b>password:</b> ${cookie.psw.value} </p> </li> </ul> </body>结果会返回你所输入的用户名和密码的值。(当然密码的值放在cookie中是很不安全的,建议放到session服务器端之中,此处只做演示之用)
此外还有cookies数组用于输出所有存放在本地的cookie值,如以下代码可以遍历本地所有的cookie值(out是jsp的内置对象,可以用于向页面打印输出)
<center> <h1>Reading Cookies</h1> </center> <% Cookie cookie = null; Cookie[] cookies = null; // 获取cookies的数据,是一个数组 cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> Found Cookies Name and Value</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("Name : " + cookie.getName( ) + ", "); out.print("Value: " + cookie.getValue( )+" <br/>"); } }else{ out.println("<h2>No cookies founds</h2>"); } %>
标签:java cookie jsp cookies session
原文地址:http://blog.csdn.net/qzp1991/article/details/38921447