200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 请求转发(request对象)和重定向(response)的区别及何时使用请求转发和重定向

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

时间:2019-03-09 15:21:21

相关推荐

请求转发(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原理简述&继承树&行头体操作

原理

继承树

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());// /day05System.out.println(getRequest().getMethod());//GETSystem.out.println(getRequest().getRequestURI());// /day05/d1System.out.println(getRequest().getQueryString());// method=t2System.out.println(getRequest().getProtocol());// HTTP/1.1System.out.println(getRequest().getServletPath());// /d1System.out.println(getRequest().getRemoteHost());// 0:0:0:0:0:0:0:1 因为是服务器自己开浏览器访问自己,所以客户端主机仍然是服务器的System.out.println(getRequest().getRemotePort());// 51088System.out.println(getRequest().getLocalAddr());// 0:0:0:0:0:0:0:1

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}

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原理简述&继承树&行头体操作

原理概述

继承树

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-8response.setContentType("text/html;charset=utf-8");//设置响应体里是html文本,编码是Utf-8}

响应体信息无限,所以一般用来传递大量数据。

字节流:” getOutputStream()

向响应体输出二进制字节流信息。【文件下载】

字符流:”getWriter()

向响应体输出字符流信息。【字符串及前端代码输出,Ajax,axios】

若输出前端代码,则会被浏览器解析执行

两个方法我们都使用其 write()方法进行数据输出。

<------------------------------------------------------->

public void t7() throws IOException {//注意:两个流不能同时调用, 否则出现异常:IllegalStateExceptionHttpServletResponse response = getResponse();//字节流// ServletOutputStream os = response.getOutputStream();// os.write(" 今天天气好晴朗 ".getBytes("utf-8"));//字符流PrintWriter writer = response.getWriter();writer.write("<h1>今天天气好晴朗</h1>");writer.flush();//建议刷流操作在请求转发中不要使用writer.write("<h1>处处好风光</h1>");//writer.close();//建议:不建议手动关流,因为该流是由服务器创建,服务器会对该流进行close()操作}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。