场景: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
打印日志:
以上,感谢。