1,请求重定向【阶段重点】
1.1:简述&原理&格式
目标:
1,理解请求重定向原理
2,熟练使用请求重定向的多种格式写法
3,掌握请求转发和重定向区别
javaEE资源跳转方式有两种:
1,重定向
2,请求转发
编辑
3,浏览器发现302状态码,就会进行自动请求。请求路径,就是响应头中location
请求重定向:依赖浏览器
请求路径会发生改变。请求转发地址栏路径没有改变。
开发简化:(BaseServlet、SpringMVC)
请求重定向:return "redirect:/路径?参数列表";
return "redirect:http://网址";
@WebServlet({"/d2"}) public class Demo2Servlet extends BaseServlet { /** * 开发简化写法(BaseServlet子类,SpringMVC) * @return */ public String run1(){ System.out.println("d2-run1"); return "redirect:/index.jsp"; } /** * 开发简化写法(BaseServlet子类,SpringMVC) * @return */ public String run2(){ System.out.println("d2-run2"); return "redirect:http://www.czxy.com"; } }
- 完整写法:(适用于 过滤器组件)
项目内跳转:response对象.sendRedirect("/项目名/路径?参数列表");
外网跳转:response对象.sendRedirect("http://网址");
/** * 完整写法(过滤器等组件) * @return */ public void run3() throws IOException { System.out.println("d2-run3"); //getResponse().sendRedirect("/day08_1/index.jsp"); getResponse().sendRedirect(getServletContext().getContextPath()+"/index.jsp"); } /** * 完整写法(过滤器等组件) * @return */ public void run4() throws IOException { System.out.println("d2-run4"); getResponse().sendRedirect("http://www.czxy.com");
- 原理写法:(适用于非servlet组件,通过response对象进行跳转)(了解)
请求重定向原理:
响应状态码:302
响应头设置:location=
/** * 原理写法(适用于非servlet组件,通过response对象进行跳转) * @return */ public void run5() throws IOException { System.out.println("d2-run5"); getResponse().setStatus(302); getResponse().setHeader("location",getServletContext().getContextPath()+"/index.jsp");} /** * 原理写法(适用于非servlet组件,通过response对象进行跳转) * @return */ public void run6() throws IOException { System.out.println("d2-run6"); getResponse().setStatus(302); getResponse().setHeader("location","http://www.czxy.com"); }
1.2:延迟重定向
编辑
/** * 延迟重定向-3秒 */ public void run7() throws IOException { //getResponse().setHeader("refresh","3;http://www.czxy.com"); //getResponse().setHeader("refresh","3;/day08_1/index.jsp"); getResponse().setHeader("refresh","3;"+getServletContext().getContextPath()+"/index.jsp"); //满足用户体验 getResponse().getWriter().write("<script>\n" + " window.onload = function (ev) {\n" + " var numNode = document.getElementById(\"num\");\n" + " setInterval(function () {\n" + " numNode.innerHTML = parseInt(numNode.innerHTML)-1;\n" + " },1000);\n" + " }\n" + " </script>\n" + " <h1>倒计时,还有<font color=\"red\" id=\"num\">3</font>秒跳转</h1>"); }
1.3:请求转发和重定向的区别
编辑
编辑1,请求转发使用request对象,重定向使用response对象
2,请求转发使用服务器端路径,重定向使用客户端路径
3,请求转发不能跳转外网,重定向可以
4,请求转发是服务器内部的跳转,不依赖网速,跳转速度极快。重定向是依赖浏览器的跳转,严重依赖网速,跳转速度略慢
5,请求转发:请求一次,响应一次。占用资源少
重定向:重定向N次,响应n+1次。占用大量资源
6,请求转发可以访问受保护目录资源,重定向不能
7,请求转发不会改变地址栏路径,重定向会改变路径
安全:请求转发。会隐藏后面转发程序的访问路径。
程序Bug:由于请求转发不会更改地址,会导致用户重复访问某个Servlet。改为重定向
8,请求转发可以使用request作用域,重定向不能
1.4:资源跳转问题
请求转发跳转问题:
请求转发因为请求路径在转发多次也不会改变。
如果跳转中出现相对路径,相对路径的出发目录:
请求地址栏目录路径来作为相对路径的出发目录:
编辑
<img src="/day09_1/aaa/3.png"/>
解决方案:
- 根本解决: 将目标资源 资源路径全部转换为绝对路径: /项目名/资源名.扩展名
- 不用请求转发,用请求重定向。(治标不治本)