使用Spring @RequestMapping路径表达式匹配字符串

时间:2018-01-10 15:11:20

标签: java spring

有没有办法使用path注释中value(或@RequestMapping)变量使用的表达式语言来匹配字符串?例如,给定字符串

/api/foo/bar/1

表达式

/api/foo/bar/{id}

应该匹配此字符串(如果表达式与给定字符串匹配,则应该可以返回布尔值true),如果可能,则捕获的字符串部分(即{id}捕获1)也应该可用。

本质上,我希望使用Spring内部用于@RequestMapping的相同机制来检查URL路径(上下文路径和路径信息的组合)是否与表达式语言匹配为{{1} }。我正在使用Spring安全过滤器进行匹配。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我建议使用方面。使用方面,您只需使用例如注释管理器接口方法即可。 @LogOnSuccess

public class UserManager{
    ...
    @LogOnSuccess
    public UserDto createUser(UserDto newUser)
        return userManager.createUser(newUser);
    }
}

如果在方法调用期间没有发生异常,则使用@AfterReturning点切割将仅调用绑定到注释的自定义操作。这样您只需记录成功的请求。它也非常易于使用且具有高可读性。

有很多关于此的好教程:例如Spring AOP Example Tutorial

答案 1 :(得分:0)

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.springframework.http.server.PathContainer;
import org.springframework.web.util.pattern.PathPattern;
import org.springframework.web.util.pattern.PathPatternParser;

@RunWith(JUnit4.class)
public class PathPatternTest {

    @Test
    public void testTrue() {
        Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/h49IB7A2B8r3eSg4q"));
        Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/123456"));
        Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/xxx?32321321"));
        Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/1234"));
    }

    @Test
    public void testFalse() {
        Assert.assertFalse(isPatternMatchUri("/users/{userId}/{token}", "/user/h49IB7A2B8r3eSg4q"));
        Assert.assertFalse(isPatternMatchUri("/users/{userId}", "/users/xxxx/12121"));
        Assert.assertFalse(isPatternMatchUri("/{userId}", "/usrs/xxx/WWQQS?"));
    }

    /***
     * is pattern match the request uri.
     */
    public boolean isPatternMatchUri(String pattern, String url) {
        PathPatternParser pathPatternParser = new PathPatternParser();
        PathPattern pathPattern = pathPatternParser.parse(pattern);
        PathContainer pathContainer = PathContainer.parsePath(url);
        return pathPattern.matches(pathContainer);
    }
}