1 回话跟踪技术cookie
http:一种基于请求/响应模式的 无状态 互联网传输协议
无状态:两次请求之间不能实现数据共享
回话跟踪技术:解决http无状态的特点 实现多次请求之间数据的共享
cookie:点心
符合http规范的 可以在请求头和响应头中传递的一种键值对对象
服务器端创建cookie 通过响应头传递给客户端 客户端端保存cookie 并每次请求都会在请求头中带上此cookie
Cookie c11=new Cookie("c11", "c11_value");
Cookie c12=new Cookie("c12", "c12_value");
resp.setHeader("Set-Cookie", "c13=c13_value");
resp.addCookie(c11);
resp.addCookie(c12);
Cookie[] carr=req.getCookies();
String str="";
for (Cookie c : carr) {
str+=c.getName()+"="+c.getValue()+"<br/>";
}
当浏览器发出请求时 /day06/s1.do 浏览器默认情况下只会带上/day06目录下资源在响应头中添加的所有cookie
- 原理视图
2 使用cookie实现登录
2.1 把登陆者的信息加到cookie中
- 修改 /teacher/login.do 添加代码
Cookie c=new Cookie("loginName", tname);
c.setPath("/");
resp.addCookie(c);
resp.sendRedirect("/java43_project_servlet_02/student/managerHtml.do");
2.2 所有的页面都判断是否登录 并获取登录者的信息
Cookie[] arr=req.getCookies();
String loginName=null;
for (int i=0;arr!=null&&i<arr.length;i++) {
if(arr[i].getName().equals("loginName")){
loginName=arr[i].getValue();
}
}
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
if(loginName==null){
resp.getWriter().print("<h1 style='color:red;text-align:center;'>必须登录才能访问学生管理页面</h1>");
resp.setHeader("Refresh", "3;url=http://localhost:8080/java43_project_servlet_02/teacher/loginHtml.do");
return;
}
stb.append("<h1 style='text-align:center;'>当前登录者:"+loginName+"老师</h1>");
3 回话跟踪技术:session
session:回话::同一个浏览器对项目的几次连续的请求 通过session域对象在这几个连续的请求之间实现数据共享
默认情况下:本次请求和上一次最近的请求之间 不能超过30分钟
3.1 session的使用
HttpSession session=req.getSession();
session.setMaxInactiveInterval(20);
session.setAttribute("s11", "s11_value还好吗");
session.setAttribute("s12", "s12_value呵呵呵");
session.setAttribute("s13", "s13_value嘿嘿嘿");
session.removeAttribute("s13");
HttpSession session=req.getSession();
Enumeration<String> names= session.getAttributeNames();
StringBuffer stb=new StringBuffer();
while(names.hasMoreElements()){
String name=names.nextElement();
stb.append("session域属性::"+name+"="+session.getAttribute(name)+"<br/>");
}
System.out.println("getId:获取sessionid::"+session.getId());
System.out.println("isNew:判断是否为当前action创建的新的session::"+session.isNew());
System.out.println("getMaxInactiveInterval:获取session的有效时间::"+session.getMaxInactiveInterval());
session.invalidate();
session=req.getSession();
System.out.println("getId:获取sessionid::"+session.getId());
System.out.println("isNew:判断是否为当前action创建的新的session::"+session.isNew());
session.setMaxInactiveInterval(20);
3.2 session原理