Java Servlet Cookies示例

时间:2020-02-23 14:36:49  来源:igfitidea点击:

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