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
- 虚拟目录一般是由方法来动态地获取,以便即使动态目录有所改变,也不必修改所有的代码。
服务器输出字符到浏览器
- 获取字符输出流
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;
}