Spring工具 - AntPathMatcher&UrlPathHelper(针对URL进行处理)

Spring工具篇(1)- AntPathMatcher&&UrlPathHelper(针对URL进行处理)

JAVA && Spring && SpringBoot2.x — 学习目录

源码版本:SpringBoot2.1.3 内含 Spring-5.1.5
源码位置:org.springframework.web.cors.UrlBasedCorsConfigurationSource#getCorsConfiguration

public class UrlBasedCorsConfigurationSource implements CorsConfigurationSource {
    //使用LinkedHashMap,保证url的顺序
    private final Map corsConfigurations = new LinkedHashMap<>();

    private PathMatcher pathMatcher = new AntPathMatcher();

    private UrlPathHelper urlPathHelper = new UrlPathHelper();
    //方法
    @Override
    @Nullable
    public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
        //获取URL的请求路径
        String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
        for (Map.Entry entry : this.corsConfigurations.entrySet()) {
            //进行Ant表达式匹配
            if (this.pathMatcher.match(entry.getKey(), lookupPath)) {
                return entry.getValue();
            }
        }
        return null;
    }
}

这个类的是CorsFilter的配置类,我们可以为每一个URL单独的提供CORS的配置。当请求时,根据Ant表达式选择最符合的配置。需要解决的问题:

  1. 如何获取Path路径;
  2. 如何使用Ant表达式进行匹配;

在Spring中提供了UrlPathHelperAntPathMatcher工具类对URL进行匹配以及处理。

1. UrlPathHelper类

源码位置:org.springframework.web.util.UrlPathHelper

UrlPathHelper API官方文档

该类位于Spring web包下,若是基于Spring web开发的应用,可以使用该帮助类里面的方法。

该类是一个帮助类,用于UrlPath的获取。实际上,我们获取请求中的URL是通过Request对象的getContextPath、getServletPath、getRequestURI方法。

在SpringBoot2.x环境下:

  1. 修改web application的上下文路径。
server:
  # 端口号
  port: 8082
  servlet:
    # 应用上下文路径
    context-path: /a
  1. 修改dispatchServlet(servlet-path)的映射路径
    @Bean
    public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
        return new ServletRegistrationBean(dispatcherServlet,"/api/*");
    }

若请求路径:http://localhost:8082/a/api/test/testool

方法 作用 结果
request.getContextPath() web application路径 /a
getServletPath() servlet的mapping路径 /api
getRequestURI() url去除协议域名端口号后的路径 /a/api/testool

UrlPathHelper中同时也含有获取request路径的方法:

方法名 作用 结果
getContextPath 获取web application路径 /a
getPathWithinApplication 获取web application内的路径 /api/testool
getServletPath 获取servlet-mapping路径 /api
getPathWithinServletMapping 获取Servlet-mapping映射内的路径 /testool
getLookupPathForRequest 根据alwaysUseFullPath属性,获取getPathWithinApplication或者getPathWithinServletMapping路径 1.alwaysUseFullPath=true/api/testool;2. 否则/testool
getRequestUri 获取请求的uri地址 /a/api/testool
getOriginatingRequestUri 获取转发请求的源地址,若无转发地址,即为本身 /a/api/testool

注:若是servlet-mapping=/,则为默认的Servlet容器,此时的ServletPath为uri - contextPath。

一般而言,是调用getLookupPathForRequest方法,获取用户上送地址。

2. AntPathMatcher类

2.1 match方法(url匹配)

我们在UrlPathHelper可以获取到请求地址,而后我们可以对URLs字符串进行匹配。

SpringMVC的路径匹配规则使用Ant规则,其基本规则如下:

  1. ? 匹配一个字符;
  2. * 匹配0个或多个字符;
  3. ** 匹配0个多多个目录;

使用方法:

    @RequestMapping("antPath")
    public void getPath(HttpServletRequest request){
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        String path = urlPathHelper.getLookupPathForRequest(request);
        System.out.println("path路径:"+path);
        AntPathMatcher matcher=new AntPathMatcher();
        boolean match = matcher.match("/**", path);
        System.out.println("是否匹配:"+match);
    }

2.2 combine(url的合并)

[科目版嗯]用于含有Ant路径的合并。

1. 规则如下表所示:

模式1 模式2 结果
null null null
/hotels null /hotels
null /hotels /hotels
/hotels /bookings /hotels/bookings
/hotels bookings /hotels/bookings
/hotels/* /bookings /hotels/bookings
/hotels/** /bookings /hotels/**/bookings
/hotels {hotel} /hotels/{hotel}
/hotels/* {hotel} /hotels/{hotel}
/hotels/** {hotel} /hotels/**/{hotel}
/*.html /hotels.html /hotels.html
/*.html /hotels /hotels.html
/*.html /*.txt IllegalArgumentException

2. 使用方式:

 /* @param pattern1 the first pattern 模式1
     * @param pattern2 the second pattern 模式2
     * @return the combination of the two patterns 返回结果
     * @throws IllegalArgumentException if the two patterns cannot be combined 两个模式无法合并
     */
    @Override
    public String combine(String pattern1, String pattern2) {
     }

你可能感兴趣的:(spring)