cookie/session总结

什么是会话?用户打开浏览器,访问一个网站进行一系列操作,关闭浏览器离开,完整过程 就是会话

    Cookie : 一种将用户信息保存在客户端技术 ,客户端会将cookie信息自动发送给服务器

    Session :一种将用户信息保存在服务器端技术 ,客户端会持有Session信息对应key,通过key找到session信息 (Session基于Cookie实现的)

    * Session 占用服务器空间,安全性更高 ,Cookie节省服务器资源,安全性差一些

 

记录上次访问时间案例

    1、第一次访问VisitServlet

        请求中没有cookie信息

        响应中 Set-Cookie: lastvisit=1350615153109

        * Cookie信息保存浏览器缓存中

    2、第二次访问VisitServlet

        请求中 Cookie: lastvisit=1350615153109

        响应中 Set-Cookie: lastvisit=1350615241359

       默认cookie都是浏览器内存中进行缓存的,当浏览器关闭,会话结束,内存释放

// 从request请求中查找 指定name的cookie信息

public Cookie findCookie(Cookie[] cookies, String name) {

       if (cookies == null) {

           // 不存在任何cookie

           return null;

       } else {

           // 存在cookie,查找指定cookie

           for (Cookie cookie : cookies) {

              if (cookie.getName().equals(name)) {

                  // 找到了

                  return cookie;

              }

           }

 

           // 没有找到

           return null;

       }

    }

      // 服务器端向客户端写出一个新的cookie

Cookie newLastVisitCookie = new Cookie("lastvisit", System.currentTimeMillis()+ "");

response.addCookie(newLastVisitCookie);

 

Cookie API 详解

1 读取cookie

    request.getCookies() 返回Cookie[]

    首先判断cookies数组是否存在 cookies == null,如果cookies存在,根据cookie的name去查找指定cookie ( 参见 上面findCookie 方法)

2、服务器向客户端发送cookie

    cookie对象创建 new Cookie(name,value)

    response.addCookie(cookie) 将cookie发送客户端

    * cookie有name和value,提供三个方法 getName getValue setValue 

3、cookie从持久性上分为两类 会话cookie和持久cookie

    会话cookie 保存在浏览器内存中cookie,当会话结束浏览器关闭,会话cookie信息就是丢失

    持久cookie 保存在浏览器临时文件缓存区中cookie (硬盘上) ,当关闭浏览器结束会话,持久cookie不会被删除

    * 持久cookie存在过期时间,过期后会自动删除

    持久cookie 需要设置cookie 有效期 setMaxAge

4、cookie访问有效路径

    携带cookie 必须path一致

    默认 http://localhost/day7/visit 生成cookie ---- 默认path 就是/day7/ (visit资源所在目录就是默认path)

    * 只有在访问 http://localhost/day7/ 目录和子目录情况下 才会携带cookie 信息

    path也可以手动指定 setPath

    newLastVisitCookie.setPath("/abc");

    抓取信息:Set-Cookie: lastvisit=1350617427109; Expires=Fri, 19-Oct-2012 04:30:27 GMT; Path=/abc

    再次访问 :http://localhost/day7/visit 不会携带cookie信息,因为path 不符合

    最简单方案:setPath("/");

    抓取信息:Set-Cookie: lastvisit=1350617644468; Expires=Fri, 19-Oct-2012 04:34:04 GMT; Path=/

5、cookie有效域名

    setDomain 设置cookie有效域名 (不需要记这个,基本不用)

    访问A 网站 ,生成 B网站 Cookie  ----- 第三方cookie (恶意cookie)

    访问A 网站, 生成A 网站Cookie ----- 第一方Cookie(安全cookie )

6、删除持久cookie

    删除持久cookie,可以将cookie最大时效设为0,注意,删除cookie时,path必须一致,否则不会删除

Cookie应用:显示商品浏览记录

import java.io.IOException;

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 com.itheima.util.CookieUtils;

public class ShowRecordsServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");

		Cookie cookie = CookieUtils
				.findCookie(request.getCookies(), "products");
		String id = request.getParameter("id");
		Cookie newcookie = null;
		if (cookie == null) {
			newcookie = new Cookie("products", id);
			newcookie.setMaxAge(60 * 60);
			newcookie.setPath("/");
			response.addCookie(newcookie);
		} else {
			String value = cookie.getValue();
			if (!CookieUtils.isExist(cookie, id))
				value = id + "," + value;
			else
				value = change(value, id);

			newcookie = new Cookie("products", value);
			newcookie.setMaxAge(60 * 60);
			newcookie.setPath("/");
			response.addCookie(newcookie);
		}
		response.getWriter().print(
				"浏览商品成功,<a href = '/day05test/cookie/products.jsp'>返回</a>");
	}

	private String change(String value, String id) {

		if (value == null)
			return null;
		String[] ids = value.split(",");
		for (int i = 0; i < ids.length; i++) {
			if (ids[i].equals(id)) {
				for (int j = i - 1; j >= 0; j--) {
					ids[j + 1] = ids[j];
				}
				ids[0] = id;
				value = ids[0];
				for (int n = 1; n < ids.length; n++) {
					value += "," + ids[n];
				}
				return value;
			}
		}
		value = id + "," + value;
		return value;

	}

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

		doGet(request, response);

	}

}

 

Session  详解

Session 将用户相关信息保存服务器端,服务器会为每个浏览器创建单独Session对象,每个用户各自数据保存各自浏览器对应Session对象中。不同用户 获取到各自浏览器对应Session 保存数据。

Session对象创建 : request.getSession();

服务器端会为每个浏览器创建单独Session对象,原理: Session 通过cookie 传输 jsessionid 用来在服务器端查找对应Session对象

 

问题:如何实现关掉浏览器后,再开浏览器,上次购买的商品还在。

1、第一次访问 响应 Set-Cookie: JSESSIONID=7B67782D880A07ADADA64A312ED23D72; Path=/day7

2、第二次访问 请求 Cookie: JSESSIONID=7B67782D880A07ADADA64A312ED23D72

关闭浏览器重新打开

3、直接访问 session2 : 无法访问刚才Session信息

 

解决方案:将jsessionid 信息保存持久Cookie'

       Cookie cookie = new Cookie("JSESSIONID", session.getId());

       cookie.setMaxAge(60 * 60 * 24);

       cookie.setPath("/");

       response.addCookie(cookie);

抓取响应

Set-Cookie: JSESSIONID=4E14F3FD831BDAD3C532C13568EEA358; Path=/day7

Set-Cookie: JSESSIONID=4E14F3FD831BDAD3C532C13568EEA358; Expires=Sat, 20-Oct-2012 06:37:50 GMT; Path=/

 

浏览器禁用Cookie之后,Session还能否使用 ? 可以

    禁用Cookie后 浏览器无法保存cookie中jsession id ,无法完成Session追踪  , 但可以通过程序生成URL (携带jsessionid的URL ): URL重写; 使用URL重写,必须该网站所有路径都使用URL重写 ,实际应用中很少采用

 

Session的生命周期

    1、Session对象创建 : request.getSession() 执行时 (当前会话第一次执行)

    2、session对象何时销毁?

    浏览器如果关闭后,Session对象是不是就销毁了?

    答案:不是,Session保存在服务器端,和浏览器是否关闭没有关系,关闭浏览器时删除会话cookie,丢失jsessionid,没有jsession无法找到服务器端对应Session

 

三种销毁Session对象情况:

    1、不正常关闭服务器(正常关闭服务器Session信息会被序列化到硬盘中 保存tomcat/work目录)

    2、Session过期 默认过期时间在tomcat/conf/web.xml 配置

<session-config>

        <session-timeout>30</session-timeout>

</session-config>

* 默认Session对象过期时间30分钟(连续不使用Session对象时间)也可以手动设置 setMaxInactiveInterval(int interval) 

 

3、在程序中执行 session.invalidate() 手动销毁Session对象

 

问题:session.removeAttribute 和 session.invalidate区别 ?

    session.removeAttribute  删除当前Session对象中一个属性值

    session.invalidate 销毁当前Session对象,删除所有属性

 

Session综合案例:采用一次性验证码用户登录

* 一次性验证码,当验证码生成后,只使用一次,不管成功或者失败,验证码都将失效 (生成验证码详情参见request/response总结)

import java.io.IOException;

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

public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String checkcode = request.getParameter("checkcode");

		String checkcode_session = (String) request.getSession().getAttribute(
				"checkcode_session");

		if (checkcode == null || !checkcode.equals(checkcode_session)) {
			request.setAttribute("message", "验证码错误,重新输入!!!");
			request.getRequestDispatcher("/session/login.jsp").forward(request,
					response);
			return;
		}
		if ("admin".equals(username) && "admin".equals(password)) {
			request.setAttribute("username", username);
			request.getRequestDispatcher("/session/welcome.jsp").forward(
					request, response);
			return;
		}
		request.setAttribute("message", "用户名或密码错误,重新输入!!!");
		request.getRequestDispatcher("/session/login.jsp").forward(request,
				response);

	}

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

		doGet(request, response);

	}

}

==================================================================================================================

ServletContext 每个web工程对应唯一对象,全局的Servlet上下文对象,允许将数据保存ServletContext --- 所有Servlet共享

HttpServletRequest 每次请求产生一个HttpServletRequest对象,允许将数据保存request对象中,结合请求转发一起使用( 当请求结束后,数据就会删除 )

HttpSession 服务器会为每个客户端创建单独Session对象,允许将数据保存session中 ,session保存的是每个用户各自的数据 

 

Servlet三种数据访问范围:ServletContext 、HttpSession、HttpServletRequest

1、保存ServletContext数据 ,在服务器关闭时才会删除,生命周期最长,全局都可以访问(最少使用)

* 网站访问次数、全局数据库连接池 需要保存ServletContext

2、保存HttpSession数据 ,三种情况下丢失 ,主要保存用户相关数据 (不建议存放大规模数据)

* 用户登录信息、购物信息 保存HttpSession

3、保存HttpServletRequest,当前请求发生时产生,响应结束数据立刻释放 (生命周期最短,最建议使用)

* Servlet获得数据处理结果,通过请求转发 传递信息给JSP显示

 

三种数据范围提供相同几个方法

setAttribute

getAttribute

removeAttribute

getParameter(); 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值