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

来源:互联网 发布:淘宝网代卖怎么做的 编辑:程序博客网 时间:2024/06/06 01:40

请求转发:
方式: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这样功能,如果后面有代码的话,还会继续执行,直到所有代码执行完毕。
但是不要出现既有重定向又有请求转发的情况,不管哪个出现在前哪个出现在后,服务器会蒙*的。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 充了q币没有到账怎么办 9个月宝宝吃了盐怎么办 红米4x开不了机怎么办 鱼身上有红斑像出血了怎么办 草鱼身上有红斑像出血了怎么办 宝宝屁眼红的破皮了怎么办 孩子身上起红疙瘩很痒怎么办 久而不射,但软了怎么办 盆底综合肌力1级怎么办 头发掉的厉害怎么办吃什么好 给蜂蛰了肿了痒怎么办 小米手环2没电了怎么办 小米手环2不亮了怎么办 红米3s无限重启怎么办 乐视手机1s卡顿怎么办 老公出轨了怎么办你会选择离婚吗 c盘和d盘换换了怎么办 晚上2点到3点醒怎么办 红米3s变砖了怎么办 6s锁屏密码忘了怎么办 怀孕9个月了胃疼怎么办 怀孕6个月了胃疼怎么办 孕妇胃疼怎么办4个月了 25岁欠了5万块钱怎么办 感冒嗓子疼怎么办最简单的方法 和老婆离婚了我的心好痛怎么办 4s店不给退定金怎么办 教你闪腰了后该怎么办 coolpad酷派手机开不了机怎么办 苹果5s黑屏开不了机怎么办 苹果4s的屏坏了怎么办 苹果6手机充电口接触不良怎么办 5s用久了卡顿怎么办 孕妇血糖高怎么办什么方法降最好 脚砸了肿了紫了怎么办 我想在淘宝上卖东西该怎么办 苹果手机4s开不了机怎么办 冒险岛s前出2条怎么办 狗狗又吐又拉血怎么办 小孩上网成瘾怎么办父母要怎么做 一只眼睛大一只眼睛小怎么办