在javax servlet过滤器中,有没有办法知道请求的去向哪个servlet?
我有一些REST资源方法,用JAX-RS(@ Path,@ GET等)注释,并由RESTEasy扫描。
有一个servlet过滤器检查用户对每个请求的权限,但我想区分REST资源。 (他们应该要求不同的特权。)
此阶段是否知道绑定了REST请求的资源方法?或者它只在请求到达过滤器后面的servlet时才匹配?
谢谢!
答案 0 :(得分:1)
如果您真的想拥有一些与授权相关的业务逻辑,则可以使用ContainerRequestFilter
来实现此目的。您可以拥有如下内容:
public void filter(ContainerRequestContext crc) throws IOException {
List<UriTemplate> matchedTemplates = uriInfo.getMatchedTemplates();
String method = crc.getMethod().toLowerCase();
String pathTemplate = "";
String curTemplate = "";
for (UriTemplate template : matchedTemplates) {
String templateString = template.getTemplate();
if (template.endsWithSlash()) {
curTemplate = templateString.substring(0, templateString.length() - 1);
}
else {
curTemplate = templateString;
}
pathTemplate = curTemplate + pathTemplate;
}
// Your authorization logic here once you have the pathTemplate.
// pathTemplate (/v1/users/{userId}/cars/{carId}) and the HTTP method
// (GET, PUT..) together will determine the choice of servlet
// (resource) and the method within to be chosen and invoked.
}
您现在可以根据授权令牌(或用于识别用户身份的其他任何内容),方法调用(GET / PUT / POST / DELETE)和pathTemplate进行授权检查。如果你为所有资源正确设计了你的路径(pathTemplates)(换句话说,如果你有&#34;范围&#34;你的路径正确),一些正则表达式魔法,你应该没有问题匹配用户的授权特定网址范围。例如:带有令牌abc
的userA只能访问/v1/users/abc/*
路径,而带有令牌pqr
的userB只能访问/v1/users/pqr/cars/*
不要忘记将其注册为泽西资源/过滤器。在dropwizard中,我们通常这样做:
environment.jersey().register(ApiRequestsFilter.class);
我希望这会有所帮助
答案 1 :(得分:0)
没有
唯一可用的信息是请求网址(路径)。
答案 2 :(得分:0)
您至少可以通过以下三种方式实现这一目标:
所有详情均可在此处找到:Jersey Security doc