Cookie和Session

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 对象 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值