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,这样它将被客户端浏览器过期并删除。

