07_servlet04

文章介绍了HTTP协议的无状态特性,以及如何通过cookie实现数据在多次请求间的共享,重点讲解了cookie的使用方法和session的概念,包括session的设置、获取和原理。同时,详细展示了如何在登录过程中使用cookie和session来保持用户状态。
摘要由CSDN通过智能技术生成

1 回话跟踪技术cookie

http:一种基于请求/响应模式的 无状态 互联网传输协议
无状态:两次请求之间不能实现数据共享
回话跟踪技术:解决http无状态的特点 实现多次请求之间数据的共享
  • 概念
cookie:点心
       符合http规范的 可以在请求头和响应头中传递的一种键值对对象
       服务器端创建cookie 通过响应头传递给客户端 客户端端保存cookie 并每次请求都会在请求头中带上此cookie
  • 代码:设置cookie
//在响应头中添加cookie
Cookie c11=new Cookie("c11", "c11_value");
Cookie c12=new Cookie("c12", "c12_value");
resp.setHeader("Set-Cookie", "c13=c13_value");在响应头中添加cookie
resp.addCookie(c11);//在响应头中添加cookie
resp.addCookie(c12);//在响应头中添加cookie

//注意:setHeader("Set-Cookie")放在后面时 addCookie无效
  • 代码:获取cookie
//获取请求头头中的cookie
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中 并跳转到学生管理页面
Cookie c=new Cookie("loginName", tname);//teacher/login.do
//设置cookie的路径  否则此cookie只能在/teacher路径下获取
c.setPath("/");//当前项目下的资源都能访问到此cookie
resp.addCookie(c);
//两次请求 才能获取上次的cookie
resp.sendRedirect("/java43_project_servlet_02/student/managerHtml.do");

2.2 所有的页面都判断是否登录 并获取登录者的信息

  • 修改 管理/修改/添加页面:添加代码
//获取请求头中的loginName的cookie
Cookie[] arr=req.getCookies();//student/managerHtml.do
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");
//如果loginName没有值  说明其没有登录就像访问学生管理页面 不允许 让其跳转到登录页面
if(loginName==null){
    //拼凑页面 页面显示信息:等待3秒钟刷新到学生管理页面
    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的使用

  • 上游添加数据
//获取session
HttpSession session=req.getSession();
session.setMaxInactiveInterval(20);
//域对象:在指定范围内实现数据共享
//域对象的方法:setAttribute getAttribute getAttributeNames removeAttribute
//上游添加数据  下游获数据
session.setAttribute("s11", "s11_value还好吗");//添加session域属性
session.setAttribute("s12", "s12_value呵呵呵");
session.setAttribute("s13", "s13_value嘿嘿嘿");
session.removeAttribute("s13");//删除session域属性
  • 下游获取数据
//获取session域属性
HttpSession session=req.getSession();

Enumeration<String> names=  session.getAttributeNames();//获取所有的session域属性名
StringBuffer stb=new StringBuffer();
while(names.hasMoreElements()){
    String name=names.nextElement();
    stb.append("session域属性::"+name+"="+session.getAttribute(name)+"<br/>");//获取一个session域属性
}

//session的其他方法
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
session=req.getSession();
System.out.println("getId:获取sessionid::"+session.getId());
System.out.println("isNew:判断是否为当前action创建的新的session::"+session.isNew());
session.setMaxInactiveInterval(20);//设置回话的有效时间

3.2 session原理

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值