JSP学习之Cookie、Session的介绍和使用

Cookie的介绍和使用(cookie设置有效期和cookie信息的获取)

  • 问题
    HTTP协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办?难道是让用户再次请求书写吗?
  • 解决
    使用cookie
  • 作用
    解决了发送的不同请求的数据共享问题;
  • 使用
    (1) 创建cookie对象
    Cookie c = new Cookie(“mouse”,“thinkpad”)
    (2) 响应cookie信息给客户端
    response.addCookie©;
  • 注意
    一个cookie对象存储一条数据。多条数据,可以多创建几个cookie对象进行存储
  • 特点
    1、浏览器端的数据存储技术;
    2、存储的数据声明在服务器端;
    3、临时存储:存储在浏览器的运行内存中,浏览器(客户端)关闭即失效;
    4、定时存储:设置了cookie的有效期,存储在浏览器(客户端)的硬盘中,在有效期内符合路径要求的请求都会附带该请求;
    5、默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径;只有该有效路径才会附带该cookie信息;
  • 清除
    在浏览器的清除历史记录中清除;
  • 注意
    重启服务器,cookie不会失效,因为存在客户端(浏览器)
  • 功能实现
    (1)设置cookie有效期
//创建cookie对象
Cookie c = new Cookie(“mouse”,“thinkpad”);

//设置cookie有效期,以秒为单位,例:3天
c.setMaxAge(3*24*3600);

//响应cookie数据
response.addCookie(c);

(2)设置cookie的有效路径,只有该请求路径才会携带c的信息;

//设置cookie的有效路径
c.setPath("cookie/abc");

//响应cookie数据
response.addCookie(c);

(3)cookie信息的获取
在目标servlet中获取携带cookie数据

//获取cookie信息数组
Cookie[] cks = request.getCookies();

//遍历数组获取cookie信息
for(Cookie c : cks){
	String name = c.getName();
	String value = c.getValue();
	System.out.println(name + ":" +value);
}
  • 注意
    若是没有附带cookie信息,cookie为null,在遍历时需要进行cookie!=null的判断

  • 案例(Cookie使用之三天免登陆)

第一步:创建CookieServlet(专门用来做登录cookie校验)

Cookei信息校验:/login/ck (请求url别名)
      判断请求中是否携带正确的cookie信息
      如果有则校验cookie信息是否正确
            如果校验正确则直接响应主页面给用户
            如果校验不正确则响应登录页面给用户
      没有则请求转发给登录页面
 
//获取请求信息
      //获取cookie信息
            //获取cookie信息数组
      Cookie[] cks = req.getCookies();
            //遍历数组获取cookie信息
//如果csk不等于空,说明登陆过,进行校验
		if(csk != null){
            //遍历cookie信息
                  String uid = “”;
                  for(Cookie c : cks){
                        if(“uid”.equals(c.getName())){
    							  uid=c.getValue();
						}
			}
			//校验UID是否存在
			if("".equals(uid)){
     		 	//uid为空,说明登录信息为空,请求转发到登录页面
      			request.getRequestDispatcher("登陆页面").forwrad(request, response);
      			return ;
			}else{
      			//校验uid用户信息,查询数据库中,是否有uid对应的这个人
      			LoginService ls = new LoginServieImpl();
     			User u = ls.checkUidService(uid);
				if(u!=null){
      				//如果有,直接重定向到登录之后的页面
	      			response.sendRedirect(‘/login/main’)
     		 		return;
				}else{
					//如果没有,直接重定向到登录页面
     				 response.sendRedirect(“/login");
     				 return;
				}
			}
	}else{
             //因为cks等于null,说明没有登陆过,重定向到登录页面
             response.sendRedirect(“/login”);
	}

第二步:在登录的servlet中添加uid到cookie;创建loginServlet用于登录a

在loginservlet中创建cookie信息实现三天免登陆
	//查询数据库,查出User对象
	User u = 查询操作;
	//成功,添加uid到cookie
	if(u!=null){
      //把uid添加进cookie
      Cookie c = new Cookie(“uid”,u.getUid()+””);
     //设置cookie的有效期
      c.setMaxAge(3*24*3600);
      c.setPath(“login/ck”)
      //添加cookie信息
      response.addCookie(c);

Session介绍和使用

  • 问题
    Request对象解决了一次请求内的不同servlet的数据共享问题,那么一个用户的不同请求的处理需要使用相同的数据怎么办呢?
  • 解决
    使用session技术
  • 原理
    用户使用浏览器第一次向服务器发送请求,服务器在接收到请求后,调用对应的servlet进行处理。在处理过程中会给用户创建一个session对象,用来存储用户请求处理相关的公共数据,并将此session对象的JESSIONID以cookie的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求中会附带JSESSIONID,服务器在接收到请求后,调用对应的servlet进行请求处理,同时根据JSESSIONID返回其对应的session对象。保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据。
  • 特点
    session技术是依赖cookie技术的服务器端的数据存储技术,由服务器进行创建;
    存储在服务器端,默认存储时间为30分钟;
    每个用户独立拥有一个session;
    一次会话(关闭浏览器一次会话结束);
  • 作用
    解决了一个用户的不同请求的数据共享问题;
  • 使用
    (1)创建session对象或获取session对象
HttpSession hs = request.getSession();

解释:

1、如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象;
2、如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器内存中;
3、所以这一步为,有session则获取session对象,没有则创建session对象
通过hs.getId()获取JSESSIONID;
4、注意:
	JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效;

(2)设置session的存储时间,过时后台会删除

方式一: hs.setMaxInactiveInterval(“秒/5”);
方式二: 将tomcat的web.xml中的<session-config>复制到项目的<web.xml>中
解释:
1、如果session对象失效了,也会重新创建一个session对象,并将其JSESSIONID对象存储在浏览器内存中;
2、注意:
	在指定的时间内,session对象没有被使用则销毁,如果使用了则重新计时;

(3)设置session强制失效(如点击退出)

hs.invalidate();

(4)存储数据

hs.setAttribute(“键”, 值);

(5)获取数据

hs.getAttribute(“键”);

注意:
	存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行;

(6)获取JSESSIONID

hs.getId()

(7)使用时机

一般用户在登录web项目时会将用户的个人信息存储到session中,供该用户的其他请求使用。
  • 作用域
    一次会话
    在JSESSIONID和session对象不失效的情况下为整个项目内;
  • 总结
    Session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下,用户的任意请求在处理时都能获取到同一个session对象。
  • Session失效处理
    将用户请求中的JSESSIONID和后台获取到的session对象的JSESSIONID进行比对,如果一致,则session没有失效,如果不一致则证明session失效了;
    如果失效则重定向到登录页面,让用户重新登录;

cookie和session的区别

  • cookie存储在浏览器(客户端),是客户端技术;
  • session的JSESSIONID存储在服务器端,是服务器端技术;
  • session依赖于cookie;
发布了46 篇原创文章 · 获赞 11 · 访问量 3910

猜你喜欢

转载自blog.csdn.net/qq_42197800/article/details/93239539