请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向

标题request和response主要区别:

1、 请求转发使用 request对象,重定向使用 response 对象
2、 请求转发使用服务器端路径,重定向使用客户端路径
3、 请求转发不能跳转外网,重定向可以跳转外网
4、 请求转发是服务器内部的跳转,不依赖网速,跳转速度极快
——重定向是依赖浏览器的跳转,严重依赖网速,跳转速度略慢
5、 请求转发:请求一次,响应一次, 占用资源少
——重定向:重定向 N 次,响应 n+1 次,占用大量资源
6、 请求转发可以访问受保护目录资源WEB-INF,重定向不能访问受保护目录
7、 请求转发不会改变地址栏路径,重定向会改变路径。
——安全:请求转发。会隐藏后面转发程序的访问路径。
——程序 BUG:由于请求转发不会更改地址,会导致用户重复访问某个 Servlet程序。解决方案:建议改为重定向
8、 请求转发可以使用 request 作用域,重定向不能使用request作用域

何时使用request和response

何时使用请求转发
1、 为了安全,隐藏某些程序的访问路径
2、 为了效率
3、 为了内存占用率低
4、 访问受保护目录资源
5、 使用 request 作用域

何时使用重定向
1、 跳转外网路径
2、 改变地址栏访问路径

除了以上 7 种情况外,两种跳转方式可以相互替代使用

请求转发&重定向图示

请求外网,用重定向,其他所有使用请求转发即可
请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第1张图片
请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第2张图片

request原理简述&继承树&行头体操作

原理

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第3张图片

继承树

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第4张图片

public void t2(){
    //http://localhost:8080/day05/d1?method=t2
    //操作请求行
    System.out.println(getRequest().getRemoteAddr());//0:0:0:0:0:0:0:1   因为是服务器自己开浏览器访问自己,所以客户端地址仍然是服务器的
    System.out.println(getRequest().getContextPath());//   /day05
    System.out.println(getRequest().getMethod());//GET
    System.out.println(getRequest().getRequestURI());//  /day05/d1
    System.out.println(getRequest().getQueryString());// method=t2
    System.out.println(getRequest().getProtocol());// HTTP/1.1
    System.out.println(getRequest().getServletPath());//  /d1
    System.out.println(getRequest().getRemoteHost());//  0:0:0:0:0:0:0:1  因为是服务器自己开浏览器访问自己,所以客户端主机仍然是服务器的
    System.out.println(getRequest().getRemotePort());//  51088
    System.out.println(getRequest().getLocalAddr());//   0:0:0:0:0:0:0:1

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第5张图片

public void t3(){
    HttpServletRequest request = getRequest();
    System.out.println(request.getHeader("Accept"));
    System.out.println(request.getHeader("User-Agent"));
    System.out.println(request.getHeader("aa"));//null
}

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第6张图片

public void t1(){
    //后台进行数据获取时,get遇到中文或特殊符号,会导致乱码问题
    //1、写过滤器
    //2、使用tomcat8.5或以上版本
    Person person = toBean(Person.class);
    System.out.println(person);

    //原生获取方式
    System.out.println("----------");
    String username = getRequest().getParameter("username");
    String aaa = getRequest().getParameter("aaa");
    String hobbyStr = getRequest().getParameter("hobby");
    System.out.println(username);
    System.out.println(aaa);
    System.out.println(hobbyStr);
    System.out.println("----------");
    String[] hobbies = getRequest().getParameterValues("hobby");
    System.out.println(Arrays.toString(hobbies));
    String[] bbb = getRequest().getParameterValues("bbb");
    System.out.println(bbb);
    System.out.println("----------");
    Map<String, String[]> map = getRequest().getParameterMap();
    System.out.println(map);
}

response原理简述&继承树&行头体操作

原理概述

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第7张图片

继承树

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第8张图片

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第9张图片
请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第10张图片

public void t6(){
    HttpServletResponse response = getResponse();
    //追加
    response.addHeader("aa","a1");
    response.addHeader("aa","a2");
    //覆盖
    response.setHeader("bb","b1");
    response.setHeader("bb","b2");

    //如果响应体中,包含中文
    //response.setCharacterEncoding("utf-8");//设置响应体的编码为utf-8
    response.setContentType("text/html;charset=utf-8");//设置响应体里是html文本,编码是Utf-8
}

请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向_第11张图片

响应体信息无限,所以一般用来传递大量数据。
字节流:” getOutputStream()
向响应体输出二进制字节流信息。【文件下载】
字符流:”getWriter()
向响应体输出字符流信息。【字符串及前端代码输出,Ajax,axios】
若输出前端代码,则会被浏览器解析执行
两个方法我们都使用其 write()方法进行数据输出。
<------------------------------------------------------->

public void t7() throws IOException {
        //注意:两个流不能同时调用, 否则出现异常:IllegalStateException
        HttpServletResponse response = getResponse();
        //字节流
//        ServletOutputStream os = response.getOutputStream();
//        os.write(" 今天天气好晴朗 ".getBytes("utf-8"));
        //字符流
        PrintWriter writer = response.getWriter();
        writer.write("

今天天气好晴朗

"
); writer.flush();//建议刷流操作在请求转发中不要使用 writer.write("

处处好风光

"
); //writer.close();//建议:不建议手动关流,因为该流是由服务器创建,服务器会对该流进行close()操作 }

你可能感兴趣的:(servlet,java,前端)