一: Cookie

1:由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的。Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用。比如判断用户是否是第一次访问网站。目前最新的规范是RFC 6265,它是一个由浏览器服务器共同协作实现的规范。 
Cookie的处理分为:

  • 服务器像客户端发送cookie
  • 浏览器将cookie保存
  • 之后每次http请求浏览器都会将cookie发送给服务器端

2:cookie是服务器发送给客户端的一小段文本,保存在浏览器虽在客户端的内存或磁盘上。一般来说,cookie是通过HTTP header从服务器返回到客户端的,服务器端在响应中利用Set-Cookie header来创建一个Cookie,然后客户端在他的请求中通过Cookie header包含这个已经创建好的Cookie。

\"\"

这个图是我们服务器的响应报头。可以看到里面有Set-Cookie。

 下面我们利用Cookie机制来做一个登录记住用户名密码。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String cookieName = \"userName\";
		String cookiePwd = \"pwd\";
		// 获得所有cookie
		Cookie[] cookies = request.getCookies();
		String userName = \"\";
		String pwd = \"\";
		String isChecked = \"\";
		// 如果cookie数组不为null,说明曾经设置过
		// 也就是曾经登录过,那么取出上次登录的用户名,密码
		if (cookies != null) {
			// 如果曾经设置过cookie,checkbox状态应该是checked
			isChecked = \"checked\";
			for (int i = 0; i < cookies.length; i++) {
				// 取出登录名
				if (cookies[i].getName().equals(cookieName)) {
					userName = cookies[i].getValue();
				}
				// 取出密码
				if (cookies[i].getName().equals(cookiePwd)) {
					pwd = cookies[i].getValue();
				}
			}
		}
		response.setContentType(\"text/html;charset=GBK\");
		PrintWriter out = response.getWriter();
		out.println(\"<HTML>\\n\");
		out.println(\"<HEAD>< >登录</ ></HEAD>\\n\");
		out.println(\"<BODY>\\n\");
		out.println(\"<CENTER>\\n\");
		out.println(\"	<FORM ACTION=\'CookieTest\'\" + \" METHOD=\'POST\'>\\n\");
		out.println(\"姓名:<INPUT TYPE=\'TEXT\'\" + \" NAME=\'UserName\' VALUE=\'\"
				+ userName + \"\'><BR>\\n\");
		out.println(\"密码:<INPUT TYPE=\'PASSWORD\' NAME=\'Pwd\' VALUE=\'\" + pwd
				+ \"\'><BR>\\n\");
		out.println(\"保存用户名和密码<INPUT TYPE=\'CHECKBOX\'\"
				+ \"NAME=\'SaveCookie\' VALUE=\'Yes\' \" + isChecked + \">\\n\");
		out.println(\"		<BR>\\n\");
		out.println(\"		<INPUT TYPE=\\\"SUBMIT\\\">\\n\");
		out.println(\"	</FORM>\\n\");
		out.println(\"</CENTER>\\n\");
		out.println(\"</BODY>\\n\");
		out.println(\"</HTML>\\n\");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CookieTest extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		Cookie userCookie = new Cookie(\"userName\", request
				.getParameter(\"UserName\"));
		Cookie pwdCookie = new Cookie(\"pwd\", request.getParameter(\"Pwd\"));
		if (request.getParameter(\"SaveCookie\") != null
				&& request.getParameter(\"SaveCookie\").equals(\"Yes\")) {
			userCookie.setMaxAge(7 * 24 * 60 * 60);
			pwdCookie.setMaxAge(7 * 24 * 60 * 60);
		} else {
			//删除Cookie
			userCookie.setMaxAge(0);
			pwdCookie.setMaxAge(0);
		}
		response.addCookie(userCookie);
		response.addCookie(pwdCookie);
		PrintWriter out = response.getWriter();
		out.println(\"Welcome,\" + request.getParameter(\"UserName\"));

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

二:Session

Session是将会话状态保存在服务器端的方案、

HTTPSession是java Servlet API中提供的对Session机制的实现规范,他仅仅是个接口,Servlet容器必须实现这个接口。当一个Session开始时,Servlet容器会创建一个HTTPSession对象,并同时在内存开辟一个空间,用来存放次Session对应的状态信息。Servlet容器为每一个HTTPSession对象分配一个唯一的标识符,成为SessionID,同时将SessionID发送到客户端,有浏览器富足保存。这样,当客户再次发送请求的时候,浏览器会同时发送SessionID,Servlet容器可以从请对象中读取SessionID,根据SessionID的值找到相对应的HTTPSession对象。

Session实例:

<html>
<head>
<  http-equiv=\"Content-Type\" content=\"text/html; charset=GBK\">
< >Session示例</ >
</head>
<body>
<center>
<FORM method=\"POST\" action=\"s1\">
<TABLE>
	<TR>
		<TD>输入数据: <input type=\"text\" name=\"count\"></TD>
	</TR>
</TABLE>
<CENTER><INPUT type=\"submit\" value=\"提交\"></CENTER>
</FORM>
</CENTER>
</body>
</html>
package com.dh.ch02;

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

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

public class FirstServlet extends HttpServlet {
	public FirstServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//设置请求的编码字符为GBK
		request.setCharacterEncoding(\"GBK\");
		//设置响应的文本类型为html,编码字符为GBK
		response.setContentType(\"text/html; charset=GBK\");
		PrintWriter out = response.getWriter();
		//获取表单数据
		String str = request.getParameter(\"count\");
		request.setAttribute(\"request_param\", str);
		HttpSession session = request.getSession();
		session.setAttribute(\"session_param\", str);	
		//out.println(\"<a href=\'s2\'>下一页</a>\");
		out.println(\"<a href=\"+response.encodeURL(\"s2\")+\">下一页</a>\");
	}

}
package com.dh.ch02;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class SecondeServlet extends HttpServlet {

	public SecondeServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		  obj = request.getAttribute(\"request_param\");
		String request_param = null;
		if (obj != null) {
			request_param = obj.toString();
		} else {
			request_param = \"null\";
		}
		HttpSession session = request.getSession();
		  obj2 = session.getAttribute(\"session_param\");
		String session_param = null;
		if (obj2 != null) {
			session_param = obj2.toString();
		} else {
			session_param = \"null\";
		}

		response.setContentType(\"text/html; charset=GBK\");
		PrintWriter out = response.getWriter();
		out.println(\"<html>\");
		out.println(\"<body >\");
		out.println(\"<h2>请求对象中的参数是 :\" + request_param + \"</h2>\");
		out.println(\"<h2>Session对象中的参数是 :\" + session_param
				+ \"</h2></body></html>\");

	}

}

 

收藏 打印