1. Cookie和Session的原理
1.1. 如何解决HTTP协议无状态问题
HTTP是无状态的,客户每次读取web页面时,服务器都打开新的连接,而且服务器也不会自动维护客户的上下文信息。
session和cookie就是两种HTTP无状态的解决方法
session将信息保存在服务端,cookie将信息保存在客户端
1.2. Cookie和Session的原理
Cookie:发给顾客一张卡,上面记录着消费数量、有效期。每次消费时,顾客出示卡片,则此次消费会和之前的消费联系起来。这种做法就是在客户端保持状态。(记录所有信息)
Session:发给顾客一张会员卡,除了卡号之外其他信息都不记录,每次消费时,顾客出示卡片,则店员找到卡号相对应的消费信息。这种做法就是在服务器端保持状态。(只记录ID,ID对应的详细信息在数据库中,每次通过ID查询匹配)
1.3. Cookie实现免登陆
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 接受前台页面的数据
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
String ch = req.getParameter("ch");
// 2. 数据处理-连接数据库作比较,返回结果
boolean flag = false;
if("wyb".equals(uname) && "123".equals(pwd)) {
flag = true;
}
// 3. 根据返回的结果给用户做出响应
if(flag) {
// 使用cookie记住密码
// 把uname中文字符串进行UTF-8格式化
String encode = URLEncoder.encode(uname, "UTF-8");
System.out.println(encode);
// 设置cookie
Cookie cookie = new Cookie("u", encode);
Cookie cookie1 = new Cookie("p", pwd);
// 设置有效范围,/:在当前服务器内有效
cookie.setPath("/");
cookie1.setPath("/");
// 设置cookie的有效期
if("yes".equals(ch)) {
// 勾选了记住密码
cookie.setMaxAge(60*60*24*30);
cookie1.setMaxAge(60*60*24*30);
}else {
cookie1.setMaxAge(0);
cookie.setMaxAge(0);
}
resp.addCookie(cookie);
resp.addCookie(cookie1);
// 登录成功
resp.sendRedirect("/success.jsp");
}else {
// 登录失败
resp.setAttribute("msg", "用户名或密码错误");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
1.4. Session原理
实现功能:登录成功后跳转到成功页面,显示用户名,后续操作均能显示当前登录的用户名;登录失败跳回登录页面
// 1. 获得session对象
HttpSession session = Request.getSession();
// 2. 将相应的值存入session中
session.setAttribute("username", uname);
- Session的失效时机
- 手动注销session:Session.invalidate()
- 超过最大非活动间隔时间:默认为30min,可以更改默认时间
- 更改TomCat中web.xml配置:会影响所有项目的所有session
<session-config> <session-timeout>30</session-timeout> </session-config>
- 更改自己项目的web.xml配置,影响当前项目的所有session
- 更改当前项目的当前session失效时间:
session.setMaxInactiveInterval(10);
- 更改TomCat中web.xml配置:会影响所有项目的所有session
- 关闭浏览器(该方式没有立刻结束session):只是把保存在浏览器中的cookie中的session清除了,服务器中的session没有真正的消失
- session和cookie的区别
- cookie数据存放在客户端,session数据存放在服务器上(sessionid可以通过cookie保存在客户端,也可用URL重写)
- cookie不是很安全(可以加密),考虑到安全应当使用session
- session会在一定时间内保存到服务器上。当访问增多,会占用较多的服务器资源。考虑到减轻服务器负担方面,应使用cookie
- 单个cookie在客户端的限制是3k。cookie的数据都以字符串的形式保存,session中可以保存对象信息
2. 统计网站访问人数
- 实现思路
- 使用JSP:只能记录一个网页的访问次数
- 使用session:就好比自己的购物车一样,不符合要求
- 使用ServletContext:一个项目/应用所有用户共享一个实例,相当于全局变量
// 获得全局对象
ServletContext context = req.getServletContext();
// 1. 获取之前登录的人数
Integer count = (Integer) context.getAttribute("count");
if(count == null) {
// 当前用户是第一个登录的人
count = 1;
}else {
count++;
}
// 将记录的值保存在context中
context.setAttribute("count", count);