(1)Servlet Cookies
①cookie的概念
定义: Cookies 是存储在客户端计算机上的文本文件,并保留了用户的各种跟踪信息
作用: 会话保持,如完成用户的登录与状态保持
② cookie工作原理
- 客户端向服务区发起登录请求
- 服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。
- 浏览器将这些信息存储在本地计算机上,以备将来使用。
- 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。
③cookie的构成
Cookies 通常设置在 HTTP 头信息中。设置 Cookie 的http请求,会向 Servlet 会发送如下的头信息:
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=bit.com
Connection: close
Content-Type: text/html
- Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域。名称和值会被 URL 编码。
- expires 字段是一个指令,告诉浏览器在给定的时间和日期之后过期(“忘记”)该 Cookie。
- 如果浏览器被配置为存储 Cookies,它将会保留此信息直到到期日期。
如果用户的浏览器指向任何匹配该 Cookie 的路径和域的页面,它会重新发送 Cookie 到服务器。浏览器的头信息可能如下所示:
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz
Servlet 就能够通过请求方法 request.getCookies() 访问 Cookie,该方法将返回一个 Cookie 对象的数组。
④Servlet 操作cookie方法
以下是在 Servlet 中操作 Cookies 时可使用的有用的方法列表:
④代码示例
(1)代码示例1-给客户端写入 Cookie:
在web.xml文件中设置:
<servlet>
<servlet-name>setck</servlet-name>
<servlet-class>SetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>setck</servlet-name>
<url-pattern>/setck</url-pattern>
</servlet-mapping>
在SetCookieServlet.java文件中:
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SetCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.设置两个基础的属性
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
// 2.给客户端写入 Cookie
Cookie nameCookie = new Cookie("username","java");
// 设置 cookie 的最大存活时间
nameCookie.setMaxAge(60); // 最大存活时间 60s
// 将 Cookie 信息写入到客户端(浏览器)
response.addCookie(nameCookie);
// 多个 Cookie 存储
Cookie pwdCookie = new Cookie("password","root");
pwdCookie.setMaxAge(-1); // 【此值如果是-1表示cookie“永”不过期】
response.addCookie(pwdCookie);
PrintWriter writer = response.getWriter();
writer.println("<h1>Cookie 写入成功~</h1>");
}
}
运行截图:
(1)代码示例2-得到客户端写入 Cookie:
在web.xml文件中设置:
<servlet>
<servlet-name>getck</servlet-name>
<servlet-class>GetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getck</servlet-name>
<url-pattern>/getck</url-pattern>
</servlet-mapping>
在GetCookieServlet.java文件中:
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class GetCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
// cookie 的读取
Cookie[] cookies = request.getCookies();
PrintWriter writer = response.getWriter();
for(Cookie cookie:cookies){
writer.println(String.format("<h1>Cookie Name:%s -> Cookie Value:%s</h1><p></p>",
cookie.getName(),cookie.getValue()));
}
}
}
运行截图:
⑤Cookie的缺点
因为Cookie是存储在浏览器端的,所以Cookie有可能被篡改和伪造。
(2) Servlet Session
①session 的概念
- 定义: session 是存储在服务器上的文本文件,并保留了用户的各种跟踪信息
- 作用: 会话保持,如完成用户的登录与状态保持,因为在服务器端,所以相对安全一些。
②session 工作原理
③Servlet 操作session方法
HttpSession 对象
- Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
- Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。
- 我们可以通过调用 HttpServletRequest 的公共方法getSession() 来获取HttpSession 对象,如下所示:
HttpSession session = request.getSession();
- 需要在向客户端发送任何文档内容之前调用 request.getSession()
下面总结了 HttpSession 对象中可用的几个重要的方法:
④代码示例
本实例说明了如何使用 HttpSession 对象获取 session 会话创建时间和最后访问时间。如果不存在session 会话,我们将通过请求创建一个新的 session 会话,并记录访问的次数。
在web.xml文件中设置:
<servlet>
<servlet-name>session</servlet-name>
<servlet-class>MySessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>
在MySessionServlet.java文件中:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class MySessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
// 操作 Session,尝试从客户端获取一个 session,如果获取
// 失败,这新创建一个session信息
HttpSession session = request.getSession();
String sessionId = session.getId();
writer.println("<h1>欢迎访问~</h1>");
writer.println(String.format("<h3>SessionID:%s</h3>",
sessionId));
writer.println("<hr>"); // 输出分隔线
// 打印 Session 的创建时间
writer.println("Session 创建时间:"+
new Date(session.getCreationTime()));
// 打印 Session 的最后访问时间
writer.println(String.format("<p></p>Session 最后访问时间:%s<p></p>",
new Date(session.getLastAccessedTime())));
// 会话 key 值定义
String sessionKey = "countkey";
// 判断当前会话信息session是否为新的会话信息
if(session.isNew() ||
session.getAttribute(sessionKey)==null){
// 表示第一次使用 session 对象
session.setAttribute(sessionKey,1);
writer.println("访问次数:1");
}else{
// 非第一次访问
int count =(int)session.getAttribute(sessionKey);
count++;
// 更新 session 信息
session.setAttribute(sessionKey,count);
writer.println("访问次数:"+count);
}
}
}
运行结果截图:
(3)面试题:Session 和 Cookie的区别是啥?
- 1.Cookie 不安全 、Session 是安全的
- 2.Cookie 是存储在浏览器端的; Session是存储在服务器端的;
- 3.Cookie 是有大小限制的(4K),Session是没有大小限制的。