Cookie
一.概述
当用户通过浏览器访问 web 应用时,通常情况下,服务器需要对用户的状态进行跟踪.例如,用户在网站结算商品时,Web 服务器必须根据请求用户的身份,找到该用户所购买的商品.在 Web 开发中,服务器跟踪用户信息的技术称为会话技术.
会话技术:从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.
会话技术分为Cookie和Session.Cookie:数据存储在客户端本地,减少服务器端的存储压力,安全性不好,客户端可以清除cookie
session:将数据存储到服务器端,安全性相对好,但会增加服务器的压力.
Cookie 技术:是将用户的数据存储到客户端的技术,其存储格式是一个键和一个值构成的,随 着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把 Cookie 保存起来,当下一 次再访问服务器时把 Cookie 再发送给服务器。
Cookie应用场景:平时在登录某些网站时,关闭浏览器后再次打开登录,用户名密码等数据会自动填充在表单。
或者我们浏览淘宝的某个商品后,下次再打开发现出现的商品很多都是我们之前浏览的同类商品等。
二.Cookie API
为了封装 Cookie 信息,在 Servlet API 中提供了一个 Javax. servlet.ht. Cookie 类
1.构造方法
Cookie 类只有一个构造方法 public Cookie(String name, String value)
参数 name 指定 Cookie 名称,value 指定 Cookie 的值
注意:名称不能更改,值可以为任何值.
2.常见方法
三.使用
1.发送一个 Cookie
//1.创建一个cookie
Cookie cookie=new Cookie("msg","hellocookie");
//2.设置 cookie 信息在浏览器的磁盘文件中存储的时间是10分钟,过期后浏览器自动删除该cookie信息
//如果不设置持久化时间,Cookie 会存储在浏览器的内存中,浏览器关闭Cookie信息销毁(会话级别的 Cookie),
cookie.setMaxAge(60*10);//设置cookie的有效时间
//3.设置 Cookie 的有效路径
/**
*Path=/day36_cookie/helloCookie,表示访问helloCookie时才会携带cookie信息
*"/"表示项目根路径,也是默认值,表示所有的请求都会携带Cookie的信息,
*一般我们使用默认即可,但是一旦设置了有效路径,那么再手动删除cookie时,还要再设置一次*/
cookie.setPath("/day36_cookie/helloCookie");
//删除Cookie
cookie.setMaxAge(0);//因为没有删除的方法,所以我们只需要将cookie的存活时间设置为0
//4.发送cookie到客户端
response.addCookie(cookie);
2. 服务端接受 Cookie
//通过request获取所有的Cookie
Cookie[] cookies=request.getCookies();
//遍历Cookie的数组,通过Cookie的名称获取我们想要的Cookie
for(Cookie cookie:cookies) {
System.out.println(cookie.getName()+" "+cookie.getValue());
}
3.案例:显示上次访问时间
预期效果:第一次访问显示的是第一次登录 ,之后每次访问显示对应的时间 .
代码:
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
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 LastTimeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取当前时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
String currentTime = sdf.format(date);
// 第一次没有这个cookie,创建并记录时间,后续每次访问都要记录当前时间并覆盖之前的cookie
Cookie cookie = new Cookie("LastTime", currentTime.replaceFirst(" ", ""));
cookie.setMaxAge(10*60);
response.addCookie(cookie);
// 获取客户端请求时携带的Cookie,获取cookie中记录的时间,展示出来
String lastTime = null;
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
for (Cookie c : cookies) {
if("LastTime".equals(c.getName())) {
lastTime = c.getValue();
}
}
}
response.setContentType("text/html;charset=utf-8");
if(lastTime == null){
response.getWriter().write("第一次登录!");
} else {
response.getWriter().write("您上次登录的时间是:" + lastTime);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
Session
一.概述
Cookie 技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共 享。但是,如果传递的信息比较多,使用 Cookie 技术显然会增大服务器端程序处理的难度 这时,可以使用 Session 实现, Session 是一种将会话数据保存到服务器端的技术。
二.Session API
Session 是与每一个请求消息紧密相关的,为此,HttpServletRequest 定义了用于获取 Session 对象的 getSession()方法,有两个重载
public HttpSession getSession(boolean create);
public HttpSession getSession();
常用方法:
三.使用
1.向 Session 中存入数据
import java.io.IOException;i
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 javax.servlet.http.HttpSession;
/**
* session的使用
* @author yyy
*
*/
public class HelloSession extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Session对象
/**
* 此方法会获得专属于当前会话的 Session 对象,如果服务器端没有该会话的 Session
* 对象会 创建一个新的 Session 返回,如果已经有了属于该会话的 Session 直接将已
* 有的 Session 返 回(实质就是根据 JSESSIONID 判断该客户端是否在服务器上已经
* 存在 session 了)
*/
HttpSession session=request.getSession();
//存储数据
session.setAttribute("msg","HelloSession");
//获取Session的ID
String id=session.getId();
//模拟JESSIONID的传递
Cookie cookie=new Cookie("JSESSIONID",id);
cookie.setPath("/helloSession");
cookie.setMaxAge(60*5);
response.addCookie(cookie);
//输出ID到客户端
response.getWriter().write("JSESSIONID:"+id);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.读取 Session 中的数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
HttpSession session=request.getSession();
Object attribute=session.getAttribute("msg");
response.getWriter().write(attribute+"");
}
四.其他知识
1. Session 对象的生命周期(面试题/笔试题)
创建:
第一次执行 request.getSession()时创建
销毁:
1. 服务器(非正常)关闭时
2. session 过期/失效(默认 30 分钟)
3. 手动销毁 session session.invalidate();
2. 时间的起算点,从何时开始计算 30 分钟?
从不操作服务器端的资源开始计时
也可以在工程的 web.xml 中进行配置 <session-config> <session-timeout>30</session-timeout> </session-config>
3. Session 作用范围
默认在一次会话中,也就是说在,一次会话中任何资源公用一个 session 对象