springboot使用Filter修改请求中的URL路径

场景:springboot使用Filter对请求的URL进行重定向
记录:NO.243
本例环境:
        apache-tomcat-8.5.57
        jdk:1.8
本例需求:
        需要重定向后,客户端无感,即浏览器URL不变。
1.UrlFilter
        实现Filter接口,并在doFilter中进行URL重定向。
        代码:

public class UrlFilter implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  
  }
  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
    StringBuffer urlBuffer = httpServletRequest.getRequestURL();
    System.out.println("UrlFilter中的urlBuffer = "+ urlBuffer.toString());
    if (urlBuffer.toString().contains("platform/work")) {
      //使用forward请求转发
      System.out.println("过滤器doFilter中调用,forward请求转发.");
      httpServletRequest.getRequestDispatcher("/fujian/shangban").forward(httpServletRequest, httpServletResponse);
      return;
    } else if (urlBuffer.toString().contains("platform/touzi")) {
      //使用sendRedirect请求转发
      System.out.println("过滤器doFilter中调用,sendRedirect请求转发.");
      String redirectUrl = "http://localhost:8080/platform/fujian/touzi?num=1024";
      httpServletResponse.sendRedirect(redirectUrl);
      return;
    }
    filterChain.doFilter(servletRequest, servletResponse);
  }  
  @Override
  public void destroy() {
  
  }
}

2.PlatformFilterConfig配置
        使用@Configuration注解配置
        @Bean注解生成UrlFilter的对象实例
        @Bean注册UrlFilter的对象实例到FilterRegistrationBean中,即可指定拦截需要拦截的URL,即指定的URL才会进行到UrlFilter中,如果配置成/*,则所有路径都会进入UrlFilter中。
        比如两个请求:
        请求一: http://localhost:8080/platform/work?num=32
        请求一: http://localhost:8080/platform/fujian/shangban?num=32
        如果配置成addUrlPatterns("/*"),则请求一和请求二均进入UrlFilter。
        如果配置成addUrlPatterns("/work/*"),则只有请求一进入UrlFilter。
        代码:

@Configuration
public class PlatformFilterConfig {
  //过滤器
  @Bean("urlFilter")
  public UrlFilter urlFilter() {
    System.out.println("注册过滤器1......");
    return new UrlFilter();
  }
  
  //注册过滤器
  @Bean
  public FilterRegistrationBean filterRegistrationBean() {
    System.out.println("注册过滤器2......");
    FilterRegistrationBean filterReg = new FilterRegistrationBean();
    filterReg.setFilter(urlFilter());
    filterReg.addUrlPatterns("/*");
    filterReg.setOrder(1);
    return filterReg;
  }
}

3.PlatformController测试类
        代码:

@RestController
@RequestMapping("/fujian")
public class PlatformController {
  @GetMapping("/shangban")
  public String getShangBan(String num) {
    System.out.println("开始上班......");
    System.out.println("上班中......");
    System.out.println("报酬 num = " + num + "万");
    System.out.println("下班回家......");
    return "Hey,GoodJob.";
  }
  @GetMapping("/touzi")
  public String getTouzi(String num) {
    System.out.println("开始投资......");
    System.out.println("投资互联网项目......");
    System.out.println("投资分成......");
    System.out.println("报酬 num = " + num + "万");
    System.out.println("财富自由.");
    return "Hey,财富自由.";
  }
}

4.测试forward
        浏览器发起请求URL:   http://localhost:8080/platform/work?num=32
        后台实际访问URL:   http://localhost:8080/platform/fujian/shangban?num=32
        打印日志:
        
5.测试sendRedirect
        浏览器第一发起请求URL:  http://localhost:8080/platform/touzi?num=1024
        实际访问URL,即浏览器发起第二次请求URL: 
        http://localhost:8080/platform/fujian/touzi?num=1024
        打印日志:
        
以上,感谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值