1.有状态和无状态的区别

有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。

无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。

2.jsp内置对象Session

 2.1 常用的方法

axios前端将用户名放到cookie里面 将用户名存入session中_客户端

 2.2 使用session保存用户名

//将用户名保存到session对象里面
//setAttribute:参数1:键名,参数2:值。
session.setAttribute("uname", uname);
req.getRequestDispatcher("/admin/admin.jsp").forward(req, resp);

   获取用户名

用户名:<%= session.getAttribute("uname") %>

2.3 设置session的最大有效活动时间 默认30分钟

session.setMaxInactiveInterval(10);//单位:秒

      同时也可以在web.xml中配置,如下代码

<!-- 设置session的时间:单位:分钟 -->
  <session-config>
  	<session-timeout>1</session-timeout>
  </session-config>

2.4 用 session 做登录状态验证

//1.获取session里面保存的用户名
	Object uname = session.getAttribute("uname");
	if(null == uname){//如果name为null,则没有登录。
		out.print("<script>alert('请先登录!');location.href='"+request.getContextPath()+"/admin/login.jsp'</script>");
    }

2.5 用 session 实现注销功能

//直接调用 invalidate() 方法
session.invalidate();
response.sendRedirect(request.getContextPath()+"/admin/login.jsp");

3. Cookie

   3.1 常用的方法

axios前端将用户名放到cookie里面 将用户名存入session中_客户端_02

  3.2 用 Cookie 做登录状态验证

  第一步:用 cookie 保存登录用户名

Cookie ck = new Cookie("uname", uname);
Cookie ck2 = new Cookie("upwd", upwd);
resp.addCookie(ck);//把cookie对象输出到客户端
ck.setMaxAge(10);//设置cookie的最大有效活动时间
//用 Cookie 页面跳转必须使用重定向
resp.sendRedirect(req.getContextPath()+"/admin/admin.jsp");

 第二步:做登录状态验证

boolean f = false;
	//1.获取所有的Cookie
	Cookie[] cks = request.getCookies();
	//2.遍历 cks
	if(null != cks){
		for(Cookie ck : cks){//ck表示cks里面的每一个对象
			if(null != ck){
				//3.获取cookie对象的key
				String cname = ck.getName();
				//4.找到保存用户名的cookie对象
				if("uname".equals(cname)){//已经登录
					f = true;
					break;
				}
			}
		}
	}
	if(f == false){//没有登录
		out.print("<script>alert('请先登录!');location.href='"+request.getContextPath()+"/admin/login.jsp'</script>");
	}

 3.3 用cookie实现注销功能

Cookie[] cks = request.getCookies();
	//2.遍历 cks
	if(null != cks){
		for(Cookie ck : cks){// ck表示 cks里面的每个对象
			if(null != ck){
				// 3.找到保存用户名的 cookie对象
				if("uname".equals(ck.getName())){
					ck.setMaxAge(0);// 设置cookie的有效活动时间为0
					if("upwd".equals(ck.getName())){
						ck.setMaxAge(0);
						response.addCookie(ck);
					}
					response.addCookie(ck);
					response.sendRedirect(request.getContextPath()+"/admin/login.jsp");
				}
			}
		}
	}

4.Cookie 和 Session 的区别

   4.1 存储位置不同

 cookie的数据信息存放在客户端浏览器上。session的数据信息存放在服务器上。

   4.2 存储方式不同

cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。(字符串)

session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。(对象)

   4.3 有效期上不同

开发可以通过设置cookie的属性,达到使cookie长期有效的效果。

session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。

  4.4 隐私策略不同

cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。

session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。

  4.5 服务器压力不同

cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。

session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存