您的位置:首页 > 其它

servlet中转发请求与重定向小结

2017-09-03 00:20 232 查看
请求转发:

方式:request.getRequestDispacther("/test.jsp").forword(request,response); 

过程分析:客户端发出一个请求reqeust到服务器,服务器找到相应的Servlet处理数据,然后调用

request.getRequestDispacther("/test.jsp").forword(request,response); 

从字面上也可以理解:带着request,response向test.jsp前进。(完全自己意淫的,不要当真...)

请求和响应都被送到另一个Servlet或者jsp(特殊的Servlet)中。这样整个过程中,只有一个请求、一个响应,所有 Servlet和JSP都共享它俩(好可怜..

),所以所有的Servlet和Jsp都可以从request中获取请求参数。

重定向:

方式:response.sendRedirect("test.jsp");

过程分析:客户端发出一个请求reqeust到服务器,服务器找到相应的Servlet处理数据,到这里都是一样一样的。然后调用

response.sendRedirect("test.jsp");

从字面上也可以理解:返回客户端一个叫test.jsp的页面。(不要当真...)

注意,这个方法是response的方法哦,这个时候它就已经给客户端响应了,这一次的请求、响应过程已经结束了!

但是呢,临了的时候它还告诉客户端,你要去test.jsp哈(死了都不老实,难怪活不过两集敲打)

于是乎客户端又向服务器发出一次去test.jsp的请求,根据http(s)特性,每次请求之间是完全独立的,所以本次请求到test.jsp页面,是不会再获取上一次request中的参数的。

不同点列举:

1、安全性

显然 请求转发更安全。一个请求在完成的过程中可能会通过多个Servlet,最终到达一个jsp页面,在整个过程中,url是不会变的。这样从客户端就看不出来服务器是由哪些资源来处理数据的。

而重定向更遵循”所见即所得“,也就是你所请求的资源,就是url显示的。比如重定向到test.jsp,url可能就是“localhost:8080/project_name/test/test.jsp”.这样不仅不安全,也限制了服务器端的灵活性。

2、可定位范围

重定向范围更广,应该说它可以重定向到任何有效的url。

而转发就比较杯具了,只能在服务器内部转发。

转发或重定向的url问题:

web.xml中有如下配置:

    <servlet>

        <servlet-name>testServlet</servlet-name>

        <servlet-class>com.test.TestServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>testServlet</servlet-name>

        <url-pattern>/servlet/testServlet</url-pattern>

    </servlet-mapping>

    <servlet>

        <servlet-name>test</servlet-name>

        <jsp-file>/WEB-INF/test.jsp</jsp-file>//直接指向jsp的标签和指向servlet的标签是不同的

    </servlet>

    <servlet-mapping>

        <servlet-name>test</servlet-name>

        <url-pattern>/servlet/test.d</url-pattern>

    </servlet-mapping>

客户端发出请求,url:localhost/project_name/servlet/testServlet(注意这个url,下面的url都和这个链接有着密切的关系)。

服务器接收到请求并匹配TestServlet去处理这个请求。然后准备请求转发。

1、url为服务器外的目标,比如百度。

url="www.baidu.com";

request.getRequestDispacther(url).forword(request,response); 

这样是不会成功的。转发的最终请求链接是:localhost/project_name/servlet/www.baidu.com(这里前缀是亮点)。完全没有跳转到百度的意思...

那试试重定向吧:

url="www.baidu.com";

response.sendRedirect(url);

也不行...最终请求还是:localhost/project_name/servlet/www.baidu.com,根本没这个url地址嘛!

修改url:

url="https://www.baidu.com";

request.getRequestDispacther(url).forword(request,response); 

还是不成功。转发的最终请求链接是:localhost/project_name/servlet/https:/www.baidu.com(还被偷吃了一个/)。

那试试重定向吧:

url="https://www.baidu.com";

response.sendRedirect(url);

成了!就是这么无耐!哼!

2、url为服务器内的目标

url="servlet/test.d";

request.getRequestDispacther(url).forword(request,response); 

不成功。转发的最终请求链接是:localhost/project_name/servlet/servlet/test.d,显然不是一个可用的url嘛。

因为同样的原因,重定向也是失败的。

修改url:

url="test.d";

都成功。

小结:

1、

1-1、如果下一个地址是服务器以外的,则只能选择重定向了。

1-2、如果是服务器内的地址,要看是否需要第一次请求时的请求参数而定,推荐使用请求转发。

2、

2-1、对于新目录中没有http(s)的:

进入该servlet时的请求是:http(s)://ip:port/project_name/preA/preB/serv.do,

Servlet中下个目标地址是url,则转发或重定向的最终请求地址是:http(s)://ip:port/project_name/preA/preB/url.

2-2、对于下个目标地址中有http(s)的:

最终请求地址:

转发:http(s)://ip:port/project_name/preA/preB/url(url如果有连续的/会被删除一个)

重定向:url

addtion:

不管是重定向还是转发,并没有return这样功能,如果后面有代码的话,还会继续执行,直到所有代码执行完毕。

但是不要出现既有重定向又有请求转发的情况,不管哪个出现在前哪个出现在后,服务器会蒙*的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: