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



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

/api/foo/bar/1

表达式

/api/foo/bar/{id}

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

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

谢谢你的帮助。

我建议为此使用方面。有了方面,您可以简单地注释管理器界面方法,例如 @LogOnSuccess .

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

如果在方法调用期间未发生异常,则使用@AfterReturning点切割将仅调用绑定到批注的自定义操作。这样,您只会记录成功的请求。此外,它非常易于使用且可读性强。

有很多关于这个的好教程:例如Spring AOP示例教程

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);
    }
}

最新更新