forward转发

本文探讨了HTTP中转发和重定向的区别。转发是服务器内部操作,URL不变,客户端只发送一次请求,常用于同一Web应用内部。而重定向会导致客户端发起新的请求,URL可见变化。文中列举了两种转发方式,并指出在拦截器中通常使用请求调度器进行转发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重定向是客户端的两次请求
转发是客户端只请求一次服务端做转发,url是不变的
转发是服务器行为,不能转发到本web应用之外的页面和网站
方式一:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/test")
public class Forward {
@RequestMapping("Beijin")
public ModelAndView test1(String name) {
    ModelAndView modelAndView = new ModelAndView();
    if (!name.equalsIgnoreCase("Beijin")) {
    //与重定向一样,只需要将关键字redirect改为forward即可
        modelAndView.setViewName("forward:/test/Other?name=" + name);
    } else {
        modelAndView.setViewName("/my/Beijin");
    }
    return modelAndView;
}


@RequestMapping("Other")
public ModelAndView test2() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/my/Other");
    return modelAndView;
}
}

/my/Beijing.ftl中的内容
练习转发,本次请求的参数是Beijin

/my/Other.ftl中的内容
练习练习转发,本次请求的参数不是Beijin,是其他字符串,url不变

请求地址:
http://127.0.0.1:8080/test/Beijin?name=xxx
在这里插入图片描述

请求地址:
http://127.0.0.1:8080/test/Beijin?name=Beijin
在这里插入图片描述
上述例子可以看出:请求的参数与规定的参数不匹配,页面会跳转至/my/Other.ftl的页面,但是请求路径不变,如果是相同情况,重定向的地址就会变为/test/Other

方式二:
通过httpServletRequest获取到请求路径做转发

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Controller
@RequestMapping("/test")
public class Forward {
@RequestMapping("Other")
public ModelAndView test2() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/my/Other");
    return modelAndView;
}

@RequestMapping("forward")
public ModelAndView forward(String name,HttpServletRequest httpServletRequest,
                    HttpServletResponse httpServletResponse){
    ModelAndView modelAndView=new ModelAndView();
    if(!name.equalsIgnoreCase("Beijin")){
        try {
            /**
             * 通过httpServletRequest获取到请求路径做转发,
             * 调用forward方法,传入Request与Response
             */
            httpServletRequest.getRequestDispatcher("/test/Other?name=" + name).
                    forward(httpServletRequest,httpServletResponse);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else {
        modelAndView.setViewName("/my/Beijin");
    }
    return modelAndView;
}
}

请求与方式一相同
第二种方式是第一种的底层实现,如果没有到控制层、没有ModelAndView的情况下,只能用第二种,例如在拦截器中只能用第二种
第二种情况,不用modelandview,getRequestDispatcher可以直接做转发

拦截器中只能用

httpServletRequest.getRequestDispatcher("/test/Othername="+name).forward(httpServletRequest,httpServletResponse);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值