response重定向
- 概念:浏览器访问服务器资源,服务器响应,返回302状态码和资源所在路径
- 代码是实现
// 1.设置状态码为302 respomse.setStatus(302); //2.设置响应头 response.setHeader("location","资源路径");
- 显然,上面的代码在进行重定向时操作时,只有资源路径是根据资源的不同会有所变化,而其他地方的写法是固定的,所以为了简化操作,java提供了简化的方法,即sendRedirect(“资源路径”)。
- 请求转发与重定向对比
- 请求转发的特点
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发只是一次请求
- 可以使用request对象来共享数据
- 重定向的特点
- 重定向地址栏发生变化
- 重定向也可以访问其他站点的资源
- 重定向是两次请求
- 不能用request对象来共享数据
- 请求转发的特点
- 路径的写法:
- 路径的分类:相对路径和绝对路径
- 相对路径:通过相对路径不可以去欸的确定唯一资源
如:./index.html
,不以 ‘/’ 开头的路径,规则:找到访问当前资源和目标资源的位置关系,’./’ 代表当前路径,‘ …/ ’(这里是两个点,csdn的显示问题) 代表上一级目录 - 绝对路径:通过绝对路径可以确定唯一资源
如http://localhost:8080/week01//wednesday/responseDemo2
,因为前面的ip是固定的,所以也通常简化为/wednesday/responseDemo2
,可以简单地认为,以 ‘/’ 开头的路径为绝对路径。- 规则:判断定义的路径是给谁用的?判断请求将来从哪发出
- 给客户端浏览器使用(请求从客户端发出,例如a标签点击事件):需要加虚拟目录
wednesday/responseDemo2
- 给服务器使用(请求从服务器端发出,例如请求转发):不需要加虚拟目录
/responseDemo2
- 虚拟目录一般是由方法来动态地获取,以便即使动态目录有所改变,也不必修改所有的代码。
- 给客户端浏览器使用(请求从客户端发出,例如a标签点击事件):需要加虚拟目录
- 规则:判断定义的路径是给谁用的?判断请求将来从哪发出
服务器输出字符到浏览器
- 获取字符输出流
response.getWriter(); - 输出数据
getWriter().println() - 中问乱码问题
- 乱码原因:编解码使用的编码格式不一致
- 查看浏览器解码的通用方法:按f12,在控制台中输入
document.characterSet
即可看到浏览器的解码方式 - 解决乱码
- 告知浏览器编码(告知的同时也设置了流的编码):
resp.setContentType("text/html;charset=utf-8")
- 注意:这段代码要放在流创建之前
服务器输出字节数据到浏览器
- 设置编码
resp.setContentType("text/html;charset=utf-8");
- 获取字节输出流
ServletOutputStream sos = resp.getOutputStream();
- 输出数据
sos.write("hello 你好".getBytes());
验证码
- 本质:是一张图片
- 作用:防止有人恶意注册
- 举例:写一张验证码:
// 设置宽高 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());
- 在登陆验证的时候我们通常使用别人已经写好的代码,然后自己修改就可以了,主要是能看懂,毕竟自己写的验证码还是很简陋的。
- 在表单登陆验证时,需要只更新验证码的时候,使用的方法是用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; }