有没有办法使用path
注释中value
(或@RequestMapping
)变量使用的表达式语言来匹配字符串?例如,给定字符串
/api/foo/bar/1
表达式
/api/foo/bar/{id}
应该匹配此字符串(如果表达式与给定字符串匹配,则应该可以返回布尔值true
),如果可能,则捕获的字符串部分(即{id}
捕获1
)也应该可用。
本质上,我希望使用Spring内部用于@RequestMapping
的相同机制来检查URL路径(上下文路径和路径信息的组合)是否与表达式语言匹配为{{1} }。我正在使用Spring安全过滤器进行匹配。
感谢您的帮助。
答案 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);
}
}