zoukankan      html  css  js  c++  java
  • 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨

     1.引子

            转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数、属性获取问题。

    2.转发和重定向

    1).转发

            转发是服务器行为,将当前请求(Request)和响应(Response)处理打包发送给目标服务(Servlet),这样下一个目标服务就能获取或操作上一个服务中的请求和响应。

    客户浏览器发送http请求—>web服务器接受此请求—>调用内部的一个方法在容器内部完成请求处理和转发动作—>将目标资源 发送给客户

    转发行为是同一次请求,其URL地址仍是以前的地址,不会发生变化,但页面内容却是新页面的东西了。转发只能是在同一应用中使用,不能跨应用转发请求,比如,京东页面的请求就不可能转发给淘宝的服务器。

    2).重定向

            重定向就如其名字一样,是将页面定位到一个新位置。重定向客户端行为,是全新的请求,客户端不能保存当前的请求,在定位到新的页面或servlet服务时,上次的请求超出请求的作用范围了,那个请求即失效了。

    客户浏览器发送http请求—>web服务器接受后发送302状态码响应及对应新的location给客户浏览器—>客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址—>服务器根据此请求寻找资源并发送给客户。

    重定向至少是两次请求,重定向后URL地址是新的地址了,当然页面内容也更新为目标页面的内容了。重定向可以定位到任意页面,可以跨越不同的应用程序。比如,天猫的页面就可以重定向到淘宝的页面上。


    参数(parameter)、属性(attribute)的区别,可以看我另一篇帖子-----Servlet中的属性(attribute)和参数(parameter)的区别

    3.简单示例

         登录页html代码

    <form action="loginServlet" method="post">
    用户名:
    <input type="text" name="username" /> <br/>&nbsp;&nbsp;码:
    <input type="password" name="pwd"/><br/>
    <!-- 默认的submit,提交给loginServlet处理 -->
    <input type="submit" value="提交至将转发的servlet"> <br/>
    <!-- 一个表单内容可以提交给不同的servlet,而formaction属性值就对应提交的目标地址,
    这里提交给loginServlet2进行请求处理 -->
    <input type="submit"  formaction="loginServlet2" value="提交至将重定向的servlet">
    </form>

         要转发的servlet

     @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
        {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            String name=request.getParameter("username");
            String pwd=request.getParameter("pwd");
            System.out.println("用户名:"+name+"	密码:"+pwd);
            //request域中设置一个属性
            request.setAttribute("nowDate", new Date());
            //转发
            request.getRequestDispatcher("forward_page.jsp?url_param=test_url_param").forward(request, response);
        }

         要重定向的servlet

      @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
        {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            String name=request.getParameter("username");
            String pwd=request.getParameter("pwd");
            System.out.println("用户名:"+name+"	密码:"+pwd);
            //request域中设置一个属性
            request.setAttribute("nowDate", new Date());
            //重定向
            response.sendRedirect("redirect_page.jsp?url_param=test_url_param");
        }

         将转发的登录页面

        转发页的html代码

    <body>
        <h3>这是一个转发后的页面</h3>
        request中获取参数(用户名):<label>${param.username}</label> <br/>
        request中获取参数(密码):<label>${param.pwd}</label> <br/>
        request中获取的属性(‘nowDate’):<label>${nowDate}</label> <br/>
        url中获取的一个参数:<label>${param.url_param}</label> <br/>
      </body>

         servlet转发到的页面

        从上图可以看出,所有的参数和属性(包括url中拼接的参数)都可以正确地获取,并显示在页面上。但url地址还是"loginServlet",不是当前页面所对应的"forward_page.jsp"地址。

         将重定向的登录页面

    重定向页的HTML代码

    <body>
          <h3>这是一个重定向后的页面</h3>
        request中获取参数(用户名):<label><c:out value="${param.username}" default="空"/></label> <br/>
        request中获取参数(密码):<label><c:out value="${param.pwd}" default="空"/></label> <br/>
        request中获取属性‘nowDate’:<label><c:out value="${nowDate}" default="空"/></label> <br/>
        url中获取的一个参数:<label><c:out value="${param.url_param}" default="空"/></label> <br/>
      </body>

         servlet重定向到的页面

           从上图可以看出,上次请求的所有属性、参数均不能获取到。另外url地址更新了,不再是servlet的映射地址了,而当前新页面的"redirect_page.jsp"地址。
    除此之外,可以看到重定向的URL中拼接的键值对参数“url_param=test_url_param”在新页面还是能获取到的。

    4.总结

           1.重定向,是一次新的请求,不能获得上次请求中的参数、属性;转发,是同一次请求,之前所有的参数、属性在新的页面或servlet中都可见的,它们保存在同一个request域中。
           2.转发操作,(即使转至新页面)其URL地址不会变化;而在重定向操作中,URL地址会更新变为重定向的目标地址。
           3.若要页面内容、URL地址均更新,并且新页面还要获取上次请求的参数、属性,可以通过一种曲线救国的方式实现:在重定向的URL中以键值对的方式来拼接上次请求的参数、属性;并在新页面中通过EL表达式“${param.name}”获取。

  • 相关阅读:
    2018-2019-2 网络对抗技术 20165337 Exp1 PC平台逆向破解(BOF实验)
    20165337《网络对抗技术》week1 Exp0 Kali安装
    BouncyCastle配置及SM2加解密demo编写
    学习总结 2020.1.4-1.10
    信息安全技术复习
    安全编程复习
    2019-2020-2 网络对抗技术 20175214 Exp9 Web安全基础
    2019-2020-2 网络对抗技术 20175214 Exp8 Web基础
    2019-2020-2 网络对抗技术 20175214 Exp7 网络欺诈防范
    2019-2020-2 网络对抗技术 20175214 Exp6 MSF基础应用
  • 原文地址:https://www.cnblogs.com/gocode/p/difference-of-forward-and-redirect.html
Copyright © 2011-2022 走看看