response重定向

  1. 概念:浏览器访问服务器资源,服务器响应,返回302状态码和资源所在路径
  2. 代码是实现
// 1.设置状态码为302
respomse.setStatus(302);
//2.设置响应头
response.setHeader("location","资源路径");
  1. 显然,上面的代码在进行重定向时操作时,只有资源路径是根据资源的不同会有所变化,而其他地方的写法是固定的,所以为了简化操作,java提供了简化的方法,即sendRedirect(“资源路径”)。
  2. 请求转发与重定向对比
  • 请求转发的特点
  • 转发地址栏路径不变
  • 转发只能访问当前服务器下的资源
  • 转发只是一次请求
  • 可以使用request对象来共享数据
  • 重定向的特点
  • 重定向地址栏发生变化
  • 重定向可以访问其他站点的资源
  • 重定向是两次请求
  • 不能用request对象来共享数据
  1. 路径的写法:
  • 路径的分类:相对路径和绝对路径
  • 相对路径:通过相对路径不可以去欸的确定唯一资源
    如:./index.html,不以 ‘/’ 开头的路径,规则:找到访问当前资源和目标资源的位置关系,’./’ 代表当前路径,‘ …/ ’(这里是两个点,csdn的显示问题) 代表上一级目录
  • 绝对路径:通过绝对路径可以确定唯一资源
    http://localhost:8080/week01//wednesday/responseDemo2,因为前面的ip是固定的,所以也通常简化为/wednesday/responseDemo2,可以简单地认为,以 ‘/’ 开头的路径为绝对路径。
  • 规则:判断定义的路径是给谁用的?判断请求将来从哪发出
  • 给客户端浏览器使用(请求从客户端发出,例如a标签点击事件):需要加虚拟目录wednesday/responseDemo2
  • 给服务器使用(请求从服务器端发出,例如请求转发):不需要加虚拟目录/responseDemo2
  • 虚拟目录一般是由方法来动态地获取,以便即使动态目录有所改变,也不必修改所有的代码。

服务器输出字符到浏览器

  1. 获取字符输出流
    response.getWriter();
  2. 输出数据
    getWriter().println()
  3. 中问乱码问题
  • 乱码原因:编解码使用的编码格式不一致
  • 查看浏览器解码的通用方法:按f12,在控制台中输入document.characterSet即可看到浏览器的解码方式
  • 解决乱码
  • 告知浏览器编码(告知的同时也设置了流的编码):resp.setContentType("text/html;charset=utf-8")
  • 注意:这段代码要放在流创建之前

服务器输出字节数据到浏览器

  1. 设置编码
    resp.setContentType("text/html;charset=utf-8");
  2. 获取字节输出流
    ServletOutputStream sos = resp.getOutputStream();
  3. 输出数据
    sos.write("hello 你好".getBytes());

验证码

  1. 本质:是一张图片
  2. 作用:防止有人恶意注册
  3. 举例:写一张验证码:
//       设置宽高
        int width =100;
        int height = 50;
//
//        1.创建一个对象,在内存中画一张图(验证码图片对象)
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//        2.美化图片
        Graphics g = image.getGraphics();//画笔对象
        g.setColor(Color.WHITE);//设置画笔颜色
        g.fillRect(0,0,width,height);//填充颜色
//        2.2话边框
        g.setColor(Color.RED);
        g.drawRect(0,0,width-1,height-1);//使其画在方框内,框和高都减去一个像素
//        2.3在图片中写字符串
        g.setColor(Color.BLACK);

        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
//        生成随机角标
        Random ran = new Random();
        for (int i = 0; i < 4; i++) {

        int index = ran.nextInt(str.length());
//        获取字符
        char ch = str.charAt(index);
        g.drawString(ch+"",20+i*20,25);
        }
//        画干扰线
        g.setColor(Color.GREEN);
//        随机生成坐标点
        for (int i = 0; i <10 ; i++) {
        int x1 = ran.nextInt(width);
        int y1 = ran.nextInt(height);
        int x2 = ran.nextInt(width);
        int y2 = ran.nextInt(height);
        g.drawLine(x1,y1,x2,y2);

        }

//        将图片输出到页面显示
        ImageIO.write(image,"jpg",resp.getOutputStream());
  1. 在登陆验证的时候我们通常使用别人已经写好的代码,然后自己修改就可以了,主要是能看懂,毕竟自己写的验证码还是很简陋的。
  2. 在表单登陆验证时,需要只更新验证码的时候,使用的方法是用js改变img标签的src,操作步骤为
  • 获取img对象
  • 设置img.src的值
  • 在路径后面加上?后面跟时间戳,因为图片会被浏览器缓存,如果路径不变,图片不会重新加载,所以需要在后面给一个参数,一个不会重复的参数,时间是不会重复的,所以在后面跟一个时间戳
  • js代码
var img = document.getElementById("checkCode");
	img.onclick = function(){
   // 加时间戳
   	var date = new Date().getTime();
  	img.src='/thursday/responseDemo4?'+date;
}