一、重定向与转发的区别
1、URL地址变和不变:转发不变,重定向变;即:
2、重定向实际上产生了两次请求转发只有一次请求
重定向: 发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器
转发:发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
二、转发include与forward的区别:forward方法是把请求的内容转发到另外的一个servlet.而include是把另一个servlet处理过后的内容拿过来.
如果写上response.getwriter(0.print("haha");
include会在页面上显示haha,而forward不显,这就是区别!哈哈
三、ServletContext读取资源三种方式
1、使用getServletContext().getResourceAsStream(路径)去读资源文件,这个路径是相对于web应用的根目录。
如://第一种方式读取外部的资源文件
InputStream is = context.getResourceAsStream("/WEB-INF/classes/res/a.jpg");
2、传统方式:BufferedReader bf = new BuffereReader(new FileReader(path));这个是重点
path=context.getRealPath("WEB-INF/classes/db.properties");这个是重点
3、第三种方式:URL url = context.getResource("WEB-INF/classes/db.properties");
InputStream is = url.openStream();
四、中文乱码问题,出现乱码的解决方案:
1、 以post方法提交的数据中有中文字符, 可以在获取请求参数值之前,调用request.setCharacterEncoding(“UTF-8”),指定请求正文使用的字符编码是UTF-8;
2、在向浏览器发送数据之前调用 response.setHeader("Content-Type", "text/html;charset=UTF-8");这是最好的一种解决方法
3、用OutputStream输出数字时出现乱码解决:response.getOutputStream().write((97+"").getBytes()); //97任意数字
4、response.getOutputStream().write("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">".getBytes());
response.getOutputStream().write("中国".getBytes("UTF-8"))。
当下载以中文名称的文件时出现乱码的解决方案:
设置消息头
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));
//URLEncoder.encode(String,String)方法是:使用指定的编码机制将字符串转换为application/x-www-form-urlencoded
格式。
五、随机图片
1、随机图片的产生:
/1、通知浏览器以图片方式打开
response.setHeader("Content-Type", "image/jpeg");
//2、创建图片
BufferedImage image=new BufferedImage(WIDTH, HEIGHT, IMAGETYPE);
//3、得到图型
Graphics g=image.getGraphics();
//4、设置图片背景色
setBackground(g);
//向图片上写边框
setBorder(g);
//向图片上写干扰线
setRandomLine(g);
//向图片上写数据
setFont(g);
//8、把图片写给浏览器
ImageIO.write(image, "JPEG", os);
2、产生图片时的问题:就每次刷新页面的时候验证码不变
解决方案://清除浏览器缓存
response.setIntHeader("expires", 0);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//可能采用的协议不一样,所以三个接合使用,缺一不可
六、request常用方法
七、防盗链的实现
//获取当前页是从哪里个页面来的,如果不是则盗链本站
String url=request.getHeader("Referer");
if(url==null||!url.startsWith(http://localhost)){
response.sendRedirect("./index.html");
}else{
response.sendRedirect("./java.html");
}