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表达式选择最符合的配置。需要解决的问题:
在Spring中提供了UrlPathHelper
和AntPathMatcher
工具类对URL进行匹配以及处理。
源码位置:org.springframework.web.util.UrlPathHelper
UrlPathHelper API官方文档
该类位于Spring web包下,若是基于Spring web开发的应用,可以使用该帮助类里面的方法。
该类是一个帮助类,用于UrlPath的获取。实际上,我们获取请求中的URL是通过Request
对象的getContextPath、getServletPath、getRequestURI
方法。
在SpringBoot2.x环境下:
server:
# 端口号
port: 8082
servlet:
# 应用上下文路径
context-path: /a
@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
方法,获取用户上送地址。
我们在UrlPathHelper
可以获取到请求地址,而后我们可以对URLs字符串进行匹配。
SpringMVC的路径匹配规则使用Ant规则,其基本规则如下:
使用方法:
@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);
}
[科目版嗯]
用于含有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) {
}