1.有状态和无状态的区别
有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。
2.jsp内置对象Session
2.1 常用的方法
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 常用的方法
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,耗费大量的内存