1、Cookie
cookie是服务器存储在客户端计算机上的文本文件,并保留了各种跟踪信息。由于存放在客户端电脑,因此信息不安全。
服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。
浏览器将这些信息存储在本地计算机上,以备将来使用。
当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。
怎么使用Cookie?
导包:import javax.servlet.http.Cookie;
1)、创建cookie对象
Cookie cookie = new Cookie("name","value");
name:代表cookie的名称keyvalue:代表当前key名称所代表的值
2)、设置最大生存期
cookie.setMaxAge(60*60*24);
单位是秒。设置为0,cookie不会保存;不设置值时,当前会话session中一直有效,结束会话cookie被删除。
3)、发送cookie到响应头
response.addCookie(cookie);
Servlet 可以通过请求的方法request.getCookies()访问Cookie,该方法将返回一个 Cookie对象的数组。下面是一个使用cookie的例子,包含了定义、获取、设置cookie的方法。
package pers.zky.cookie.util;
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;
//处理get请求信息的servlet
public class TestCookie extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
//定义两个String,接收上次登录存储在cookie中的信息
String firstName = "";
String lastName = "";
//获取本次输入的参数
String first_name = request.getParameter("first_name");
String last_name = request.getParameter("last_name" );
//通过request对象获取cookie数组
Cookie[] cookies = request.getCookies();
//若数组不为空,则根据cookie数组获取上次登录信息
if(cookies != null){
for (int i = 0; i < cookies.length; i++) {
if(cookies[i].getName().equals("first_name")) firstName = cookies[i].getValue();
if(cookies[i].getName().equals("last_name")) lastName = cookies[i].getValue();
}
}
//创建两个cookie存储本次登录信息
Cookie first_cookie = new Cookie("first_name",first_name);
Cookie last_cookie = new Cookie("last_name",last_name);
//设置cookie的最大生存期
first_cookie.setMaxAge(60);
last_cookie.setMaxAge(60);
//添加cookie到response对象
response.addCookie(first_cookie);
response.addCookie(last_cookie);
//输出相关信息到页面
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("本次登录信息:<br/>");
out.println("firstName:"+first_name+"<br/>");
out.println("lastName :"+ last_name+"<br/>");
out.println("上次登录信息:<br/>");
out.println("firstName:"+firstName+"<br/>");
out.println("lastName :"+ lastName+"<br/>");
}
}
<!-- 在web.xml中配置servlet -->
<servlet>
<servlet-name>TestCookie</servlet-name>
<servlet-class>pers.zky.cookie.util.TestCookie</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestCookie</servlet-name>
<url-pattern>/testCookie</url-pattern>
</servlet-mapping>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 首页 -->
<html>
<head>
<meta charset="utf-8">
<title>TestCookie</title>
</head>
<body>
<form action="testCookie" method="get">
FirstName:<input type="text" name="first_name"><br/>
LastName :<input type="text" name="last_name"><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
由于在servlet中没有处理请求的编码,获取的编码默认是ISO-8859-1,不支持汉字集。用拼音测试如下:
首次访问:
第二此访问:
2、Session
session代表服务器与浏览器的一次会话过程,session有一个唯一标识的sessionID。
当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象。
当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会将sessionID置于cookie中并放置到请求头,发送给服务器。
服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。
一个会话只能有一个session对象,session的唯一表示是sessionID。
怎么使用Session?
1)、创建或获取session对象
HttpSession session = request.getSession();
2)、指定session会话最大间隔时间
session.setMaxInactiveInterval(2*60);
3)、给session设置属性
session.setAttribute("first_name", first_name);
session.setAttribute("last_name", last_name);
服务器响应时回自动把session的ID带回客户端,而session本身的数据是存放在服务端的。客户端下次访问时会将sessionID置于请求头中,服务器根据sessionID来识别session对象。
下面有一个session使用的例子:
package pers.zky.session.util;
import java.io.IOException;
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 TestSession extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取输入的信息
String first_name = request.getParameter("first_name");
String last_name = request.getParameter("last_name");
//获取session,没有session对象时自动创建
HttpSession session = request.getSession();
//指定session有效时间为2分钟
session.setMaxInactiveInterval(2*60);
//设置session对象的属性
session.setAttribute("first_name", first_name);
session.setAttribute("last_name", last_name);
//重定向到session.jsp
response.sendRedirect("session.jsp");
}
}
<!-- 在web.xml中配置servlet -->
<servlet>
<servlet-name>TestSession</servlet-name>
<servlet-class>pers.zky.session.util.TestSession</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestSession</servlet-name>
<url-pattern>/testSession</url-pattern>
</servlet-mapping>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 首页index.jsp -->
<html>
<head>
<meta charset="utf-8">
<title>TestSession</title>
</head>
<body>
<form action="testSession" method="get">
FirstName:<input type="text" name="first_name"><br/>
LastName :<input type="text" name="last_name"><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 服务端响应给客户端的页面session.jsp -->
<html>
<head>
<meta charset="utf-8">
<title>TestCookie</title>
</head>
<body>
<%
String first_name = (String)session.getAttribute("first_name");
String last_name = (String)session.getAttribute("last_name");
out.println(first_name);
out.println(last_name);
%>
</body>
</html>
为了测试方便,在这里session.jsp和index.jsp都是直接置于WebRoot下面的,可以通过浏览器地址栏直接访问。
直接访问session.jsp,得到的处理结果是null null:
通过index.jsp填写信息后提交,服务器处理完请求后返回的时刚刚输入的信息:
这时,多次刷新session.jsp或者在同一个浏览器的新窗口中打开session.jsp,均可以得到上面这张图片的结果。这是因为session设置的有效时间是2分钟,要是在间隔2分钟以后再刷新session.jsp,便会又得到null null。同时,sessionID也会变化,客户端会为新的会话分配一个新的ID。
上面是使用谷歌浏览器进行访问的,在会话有效时间内,用其他的浏览器同时访问页面,这将产生一个新的会话。
关闭浏览器后在打开页面,也会产生一个新的会话。
3、Cookie和Session的区别
1)、session是在服务器端保存用户信息,cookie是在客户端保存用户信息。这样session就比cookie更加安全,但同时session也占用了服务器资源。
2)、cookie通常用于保存不重要的用户信息,重要的信息使用session保存
3)、session中保存的是对象,cookie保存的是字符串。
4)、session随会话结束而关闭,cookie可以长期保存在客服端。