Java Servlet Cookies示例
欢迎使用Java Servlet Cookies示例。
Cookie在网络客户端与服务器之间的通信中使用很多,它不是Java特有的。
Cookies的一些常见用法是:
通过使用Cookie进行会话身份验证,我们在Servlet会话教程中了解到HttpSession使用" JSESSIONID" cookie来跟踪用户会话。
根据客户的喜好对客户进行个性化响应,例如,我们可以在客户浏览器中将背景颜色设置为cookie,然后使用它自定义响应背景颜色,图像等。
Java Servlet中的Cookie
Cookies是服务器发送到客户端的文本数据,并保存在客户端本地计算机上。
客户端将请求发送到服务器时,它将服务器存储的cookie传递到请求标头中,如下所示:
Cookie Test="Test Cookie5"
客户端可以向服务器发送多个cookie,并且我们可以禁用cookie以根据浏览器首选项存储在客户端。
除了键值对之外,服务器还会在响应标头中向客户端发送一些其他数据,如下所示。
Set-Cookie Counter=7; Version=1; Comment="SetCookie Counter"; Domain="localhost"; Max-Age=86400; Expires=Thu, 15-Aug-2013 20:19:19 GMT; Path=/cookie/SetCookie Set-Cookie Test="Test Cookie7"; Version=1; Comment="Test Cookie"
请注意,服务器会为cookie发送一些其他信息,例如注释,域,cookie过期之前的最长时间以及浏览器应在请求中将cookie发送回的路径。
但是,当客户端向浏览器发送cookie时,它仅发送cookie的名称和值。
Servlet API通过实现了Serializable和Cloneable接口的javax.servlet.http.Cookie类提供cookie支持。
提供HttpServletRequest的getCookies()方法来从请求中获取Cookie数组,因为没有向请求添加Cookie的意义,所以没有设置或者向请求添加cookie的方法。
类似地,提供了HttpServletResponseaddCookie(Cookie c)
方法来在响应头中附加cookie,没有用于cookie的getter方法。
Cookie类具有一个采用名称和值的构造函数,因为它们是cookie的必需参数,所有其他参数都是可选的。
Cookie类的一些重要方法是:
getComment()–返回在客户端使用的描述此cookie用途的注释。
请注意,当客户端在请求标头中发送Cookie时,服务器不会收到此信息。
我们可以使用setComment()方法在服务器端设置cookie描述。getDomain()–返回cookie的域名。
我们可以使用setDomain()方法设置cookie的域名,如果设置了域名,则cookie仅发送到该特定域名请求。getMaxAge()–返回最大寿命(以秒为单位)。
我们可以使用setMaxAge()设置cookie的过期时间。getName()–返回cookie的名称,可在浏览器和服务器端使用。
名称没有设置器,我们只能通过构造函数设置名称一次。getPath()–返回浏览器将此cookie返回到的服务器上的路径。
我们将看到一个示例,其中cookie仅被发送到特定资源。
我们可以使用setPath()指示浏览器仅将cookie发送到特定资源。getSecure()–如果浏览器仅通过安全协议发送cookie,则返回true;如果浏览器可以使用任何协议发送cookie,则返回false。
我们可以使用setSecure()方法来指示浏览器仅通过安全协议发送cookie。getValue()–以字符串形式返回cookie的值。
还有setValue()方法来更改cookie的值。getVersion()–返回此cookie遵循的协议的版本。
还有一个版本的设置方法。isHttpOnly()–检查此Cookie是否已标记为HttpOnly。
还有一个setter方法,我们可以用来指示客户端仅将其用于HTTP。
Java Servlet Cookie示例
我们将创建两个简单的servlet,以从客户端打印cookie,其中一个servlet中,我们将为每个域设置一个cookie,并为cookie设置路径设置,以便其他servlet不会从客户端接收到该cookie。
下图是Java Servlet中Cookie的最终项目结构。
SetCookie.java:此servlet将设置一些cookie并将其发送到浏览器。
它还将打印cookie信息并将其作为HTML响应发送。
package com.theitroad.servlet.cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/cookie/SetCookie") public class SetCookie extends HttpServlet { private static final long serialVersionUID = 1L; private static int count = 0; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); Cookie[] requestCookies = request.getCookies(); out.write("<html><head></head><body>"); out.write("<h3>Hello Browser!!</h3>"); if(requestCookies != null){ out.write("<h3>Request Cookies:</h3>"); for(Cookie c : requestCookies){ out.write("Name="+c.getName()+", Value="+c.getValue()+", Comment="+c.getComment() +", Domain="+c.getDomain()+", MaxAge="+c.getMaxAge()+", Path="+c.getPath() +", Version="+c.getVersion()); out.write("<br>"); } } //Set cookies for counter, accessible to only this servlet count++; Cookie counterCookie = new Cookie("Counter", String.valueOf(count)); //add some description to be viewed in browser cookie viewer counterCookie.setComment("SetCookie Counter"); //setting max age to be 1 day counterCookie.setMaxAge(24*60*60); //set path to make it accessible to only this servlet counterCookie.setPath("/ServletCookie/cookie/SetCookie"); //adding cookie to the response response.addCookie(counterCookie); //set a domain specific cookie Cookie domainCookie = new Cookie("Test", "Test Cookie"+String.valueOf(count)); domainCookie.setComment("Test Cookie"); response.addCookie(domainCookie); out.write("</body></html>"); } }
GetCookie.java:一个简单的Servlet,它将演示浏览器不会将SetCookie中具有特定Path设置的cookie发送到该servlet。
package com.theitroad.servlet.cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/cookie/GetCookie") public class GetCookie extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); Cookie[] requestCookies = request.getCookies(); out.write("<html><head></head><body>"); out.write("<h3>Hello Browser!!</h3>"); if(requestCookies != null){ out.write("<h3>Request Cookies:</h3>"); for(Cookie c : requestCookies){ out.write("Name="+c.getName()+", Value="+c.getValue()+", Comment="+c.getComment() +", Domain="+c.getDomain()+", MaxAge="+c.getMaxAge()+", Path="+c.getPath() +", Version="+c.getVersion()); out.write("<br>"); //delete cookie if(c.getName().equals("Test")){ c.setMaxAge(0); response.addCookie(c); } } } out.write("</body></html>"); } }
当您运行该程序时,您会注意到一些事情:
Cookie" Counter"仅发送到SetCookie,GetCookie将永远不会收到此Cookie。
除名称和值外,所有其他变量都在打印默认值。
MaxAge的默认值为-1,版本的默认值为0。GetCookie将"测试" cookie的最长期限设置为0,这样它将被客户端浏览器过期并删除。