关于cookie不得不说的事儿

12 篇文章 0 订阅
2 篇文章 0 订阅

    在网站开发中经常要用到cookie来存放一些用户信息,比如登录密码,购物列表啊等等

接下来简要剖析一下cookie

Cookies有以下几个特点:

1、只能是文本内容,而且长度不得大于4KB

2、客户端可以阻止cookie的写入,故而用cookie来实现功能存在一些不稳定因素

3、子路径设置的cookie,父路径不能读取,相反父路径设置的cookie,子路径可以读取。这一点十分重要,也比较容易犯错误。

 

接下来手动创建几个cookies:

package cookies;

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

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Setcookies extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.setCharacterEncoding("GBK");
		resp.setContentType("text/html;charset=GBK");
		for (int i = 0; i < 3; i++) {
			// 生成3个临时cookies,该cookie存放在内存中,一旦浏览器被关闭则被自动清除
			Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value-S"
					+ i);
			// 将cookie放入应答消息中,返回给客户端,临时cookie就存放于客户端内存
			resp.addCookie(cookie);
			// 生成3个有生命周期的cookie,存放于文本中(ie浏览器的cookie文本中),即使浏览器关闭也不会消失
			cookie = new Cookie("Persisten-Cookie-" + i, "Cookie-Value-P" + i);
			// setMaxAge(int t)设置一个生命周期,t为其值,以秒为单位
			cookie.setMaxAge(3600);
			// 将cookie放入应答消息中,返回给客户端,有生命周期的cookie就存放于客户端文本中
			resp.addCookie(cookie);

		}
		// 启用一个输出流,将内容输出到页面上
		PrintWriter out = resp.getWriter();
		out
				.println("<html><head>"
						+ "<meta http-equiv=\"content-type\" content=\"text/html; charset=gbk\">"
						+ "<title>生成cookie</title>" + "</head>"
						+ "<body><a href=\"Showcookies\">查看cookie</a>"
						+ "</body></html>");
		// 记得关闭输出流,节省开销
		out.close();
	}

	// 重写doPost方法,让其调用doGet方法
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}

}

   

上面通过Setcookies产生6个cookies,接下来获取这6个cookies并且显示在页面上:

package cookies;

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

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Showcookies extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// 设置编码方式
		req.setCharacterEncoding("gbk");
		resp.setContentType("text/html;charset=gbk");
		// 用一个html表格来显示我们得到的cookie数据
		String title = "Active Cookies";
		PrintWriter out = resp.getWriter();
		out
				.println("<html><head><title>"
						+ "参数客户端Cookie"
						+ "</title>"
						+ "<meta http-equiv=\"content-type\" content=\"text/html; charset=gbk\">"
						+ "</head>" + "<body bgcolor=\"#fdf5e6\">"
						+"<center>"
						+ "<h1 align=\"center\">" + title + "</h1>\n"
						+ "<table border=1 algin=\"center\">\n"
						+ "<tr bgcolor=\"#ffad0o\">\n" + "<th>Cookie Name\n"
						+ "<th>Cookie Value");
		// 从客户端的请求中取本网站的cookie信息,此时http为连接状态
		Cookie[] cookies = req.getCookies();
		// 得到cookie信息,输出到页面上
		if (cookies != null) {
			Cookie cookie;
			for (int i = 0; i < cookies.length; i++) {
				cookie = cookies[i];
				out.println("<tr>\n" + "<td>" + cookie.getName() + "</td>\n"
						+ "<td>" + cookie.getValue() + "</td>\n");
			}
			out.println("</table><center></body></html>");
			out.close();
		}
	}

}

 xml配置文档:

 

<servlet>
		<servlet-name>Setcookies</servlet-name>
		<servlet-class>cookies.Setcookies</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Setcookies</servlet-name>
		<url-pattern>/Setcookies</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>Showcookies</servlet-name>
		<servlet-class>cookies.Showcookies</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Showcookies</servlet-name>
		<url-pattern>/Showcookies</url-pattern>
	</servlet-mapping>
 

 先启动Setcookies创建6个cookies,再启动Showcookies,成功显示了创建的6个cookies,其中最后一项应该是浏览器默认生成的,于我们的操作无关。

 

 

接下来解释:子路径设置的cookie,父路径不能读取,相反父路径设置的cookie,子路径可以读取。

修改xml配置文件如下:

<servlet>
		<servlet-name>Setcookies</servlet-name>
		<servlet-class>cookies.Setcookies</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Setcookies</servlet-name>
		<url-pattern>/Setcookies</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>Showcookies</servlet-name>
		<servlet-class>cookies.Showcookies</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Showcookies</servlet-name>
		<url-pattern>/test/Showcookies</url-pattern>
	</servlet-mapping>

 现在,Showcookies成为了url下的test子路径了,而Setcookies此时是一个父路径。执行程序,成功获取cookies信息。

 

 

继续更改xml文件:

	<servlet>
		<servlet-name>Setcookies</servlet-name>
		<servlet-class>cookies.Setcookies</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Setcookies</servlet-name>
		<url-pattern>/test/Setcookies</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>Showcookies</servlet-name>
		<servlet-class>cookies.Showcookies</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Showcookies</servlet-name>
		<url-pattern>/Showcookies</url-pattern>
	</servlet-mapping>

现在Setcookies成了URL的子路径test下的servlet,而Showcookies为父路径,执行Showcookies此时已经无法获取cookies信息了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值