欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet —— Cookie

程序员文章站 2024-03-20 14:00:16
...

在Servlet之间传递信息的方式有很多种,重写URL和隐藏域在多个页面中传递信息时处理起来比较麻烦
而cookie由http控制,可以比较方便地在多个压面之间传递,cookie的问题在于可能会被用户设置禁用
cookie是包含在http首部的信息,服务器请求在浏览器中设置一个cookie时,会包含一个首部行:
Set-Cookie : Key=Value

浏览器向同一个服务器发回请求时就会带上这个cookie首部行:
Cookie : Key=Value

服务器可以设置不止一个cookie,但浏览器通常对同一网站cookie的数量有限制

另外,cookie还有多个属性:

Path属性 :Path=/....    用于控制该cookie的作用路径
domain属性:控制作用域
Set-Cookie : Key=Value ; Domain=abc.com ; Path=/login

该cookie对abc.com下的子树/login下的所用页面有效

expires属性:以一个截止日期控制有效时间,格式为:Wdy,DD-Mon-YYYY HH:MM:SS GMT

Max-age属性:以一个倒计时控制有效时间,Max-age=seconds

还有用于安全控制的secure属性和httponly,这两个属性没有值,加在cookie行就可以了
httponly 将控制只能由http或者https送回cookie,禁用javascript
secure 限制浏览器只能通过安全通道发送cookie

在Servlet中通过
new Cookie(key,value);

新建一个cookie对象,通过setDomain(Str)等一系列的方法设置属性

以下是一个设置并回显一个cookie的demo
package com.ryo.j2ee.test.cookie;

import java.io.IOException;
import java.io.PrintWriter;

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;

import com.ryo.j2ee.bean.User;

@WebServlet(name="Demo2",urlPatterns= "/user")
public class SetCookieServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	User user = new User();
	
	@Override
	public void init() {
		user.setUsername("root");
		user.setUserpwd("rootpwd");
	}
	
	@Override
	public void doGet(HttpServletRequest req ,HttpServletResponse res) throws IOException {
		res.setContentType("text/html");
		PrintWriter pw = res.getWriter();
		pw.print("<html><body>");
		pw.print("<form method='post'><table>");
		pw.print("<input type='submit' value='set'/></br>");
		pw.print("</table></form></body></html>");

	}
	
	@Override
	public void doPost(HttpServletRequest req ,HttpServletResponse res) throws IOException {
		Cookie cookie = new Cookie("name",user.getUsername());
		cookie.setMaxAge(60);
		res.addCookie(cookie);
		PrintWriter pw = res.getWriter();
		pw.print("set cookie successfully</br><a href='showuser'>showuser</a>");
	}
	
	
	
	
}

package com.ryo.j2ee.test.cookie;

import java.io.IOException;
import java.io.PrintWriter;

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(name="ShowCookie",urlPatterns="/showuser")
public class ShowCookieServlet extends HttpServlet{
	
	private static final long serialVersionUID = 2L;

	@Override
	public void doGet(HttpServletRequest req ,HttpServletResponse res) throws IOException {
		res.setContentType("text/html");
		Cookie[] cookies = req.getCookies();
		Cookie user = null;
		if(cookies != null) {
			for(Cookie cookie:cookies) {
				if(cookie.getName().equals("name")) {
					user = cookie;
					break;
				}
			}
		}
		PrintWriter pw = res.getWriter();
		pw.print("<html><body>");
		pw.print("cookie :  "+user.getName()+" "+user.getValue());
		pw.print("</body></html>");
	}

}


需要说明的是,现在HttpServletRequest req.getCookies();返回的是所有可用的cookie组成的数组,需要通过遍历获取目标cookie

另外,删除cookie也没有直接的api,可采用方法是new一个同名cookie,并把Max-age属性设置为0
Cookie cookie = new Cookie(samename , "");
cookie.setMaxAge(0);
res.addCookie(cookie);