spring-security mvc匹配器和mvcMap处理程序的工作方式不同

hmae6n7t  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(139)

spring handler mapping不是使用spring HandlerMappingIntrospector来匹配接收到的url吗?那么为什么mvc macther,它本身使用这个类,不能像handler mapping那样工作呢?例如,在@RequestMapping中,你不能把/放在地址前面,程序就能正常工作。但是在mvc matcher中,如果我们不把/放在地址前面,那个页面就不能被保护。为什么?

@RequestMapping("contact") // it works

但是:

http.csrf().disable()
                .authorizeRequests()
                .mvcMatchers("contact").authenticated() //if we do not put / at the first of the home it does not recohnize the address
nvbavucw

nvbavucw1#

构建RequestMappingInfo时,如果用户未指定“/”,则在PathPatternsRequestCondition构造函数中解析路径时,会自动将“/”附加到路径前面。源代码如下:

public PathPatternsRequestCondition(PathPatternParser parser, String... patterns) {
    this(parse(parser, patterns));
}

private static SortedSet<PathPattern> parse(PathPatternParser parser, String... patterns) {
    if (patterns.length == 0 || (patterns.length == 1 && !StringUtils.hasText(patterns[0]))) {
        return EMPTY_PATH_PATTERN;
    }
    SortedSet<PathPattern> result = new TreeSet<>();
    for (String path : patterns) {
        if (StringUtils.hasText(path) && !path.startsWith("/")) {
            path = "/" + path;
        }
        result.add(parser.parse(path));
    }
    return result;
}

这将导致“/contact”与“contact”不匹配

相关问题