@Path("/v1/users/registration")
@Produces(MediaType.APPLICATION_JSON)
@Api(value = "/users/registration")
public class UserRegistrationResource {
@POST
@AuthorizedFor(Realm.SOCIAL) // The custom annotation class
public SessionModel register(
@Valid
@ApiParam(value = "New user to be registered", required = true)
NewUser user) throws Exception {
// Some logic
...
}
}
@Provider
public class AuthorizationFilter implements ContainerRequestFilter {
@Context
AbstractMethod method;
@Override
public ContainerRequest filter(ContainerRequest request) {
// At this point, the method parameter is null :(
Realm realm = null;
User user = Context.get(Session.class).getUser();
for (Annotation annotation : method.getAnnotations()) {
if (AuthorizedFor.class == annotation.annotationType()) {
realm = ((AuthorizedFor) annotation).value();
}
}
if (realm != null) {
for (Realm userRealm : user.getRole().getAllowedRealms()) {
if (userRealm.equals(realm)) {
return request;
}
}
}
throw new ApiException(ResponseCode.UNAUTHORIZED);
}
}
@Provider
public class AbstractMethodProvider extends AbstractHttpContextInjectable<AbstractMethod> implements InjectableProvider<Context, Parameter> {
@Override
public Injectable<AbstractMethod> getInjectable(ComponentContext ic, Context context, Parameter parameter) {
if (parameter.getParameterType() == AbstractMethod.class) {
return this;
}
return null;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public AbstractMethod getValue(HttpContext context) {
return context.getUriInfo().getMatchedMethod();
}
}
environment.jersey().getResourceConfig().getContainerRequestFilters().add(new AuthorizationFilter());
environment.jersey().register(new AbstractMethodProvider());
您可以实现ResourceFilterFactory来获取AbstractMethod。
public class AuthorizationFilterFactory implements ResourceFilterFactory {
@Override
public List<ResourceFilter> create(AbstractMethod abstractMethod) {
return Arrays.asList(this.createAuthorizationFilter(abstractMethod));
}
private ResourceFilter createAuthorizationFilter(final AbstractMethod abstractMethod) {
return new ResourceFilter() {
@Override
public ContainerRequestFilter getRequestFilter() {
return new AuthorizationFilter(abstractMethod);
}
@Override
public ContainerResponseFilter getResponseFilter() {
return null;
}
};
}
}
因此,您的AuthorizationFilter将如下所示:
@Provider
public class AuthorizationFilter implements ContainerRequestFilter {
private final AbstractMethod method;
public AuthorizationFilter(AbstractMethod method) {
this.method = method;
}
@Override
public ContainerRequest filter(ContainerRequest request) {
Realm realm = null;
User user = Context.get(Session.class).getUser();
for (Annotation annotation : method.getAnnotations()) {
if (AuthorizedFor.class == annotation.annotationType()) {
realm = ((AuthorizedFor) annotation).value();
}
}
if (realm != null) {
for (Realm userRealm : user.getRole().getAllowedRealms()) {
if (userRealm.equals(realm)) {
return request;
}
}
}
throw new ApiException(ResponseCode.UNAUTHORIZED);
}
}
要注册您的工厂:
environment.jersey().getResourceConfig().getResourceFilterFactories().add(new AuthorizationFilterFactory());
我正在尝试实现一个检查一些东西的ContainerRequest estFilter。最终,它将验证一个令牌,但我还没有到那里。该过滤器在Grizzly HTTP Server(Grizzly 2.3.4)上运行,位于JAX-RS资源(泽西2.0)前面。我也在使用Guice 3.0。 当我尝试将 javax.ws.rs.container.ResourceInfo 注入到过滤器中时,它为空。 将请
问题内容: 我正在尝试编写一个可以检索请求URL的过滤器,但是我不确定该怎么做。 这是我到目前为止的内容: 当我在服务器上点击页面时,唯一看到的输出是“ Url:null”。 从过滤器中给定的ServletRequest对象获取请求的URL的正确方法是什么? 问题答案: 这是您要找的东西吗? 重建: 和的信息。
我正在运行一个简单的maven项目(Maven3.3.9),其中包含配置文件和资源筛选。似乎总是在默认配置文件上进行筛选。 src/main/filters(默认)中有两个配置文件:config-dev.properties和config-prod.properties(仅包含一个变量application.env=development application.env=production 和s
我有一个小的angularjs应用程序,它在其中一个控制器中使用angularjs资源。下面是资源使用的代码 当页面第一次加载时,一切都很好,我得到了我需要的所有数据。但当我提出第二个请求时(例如,按下页面上调用getFilteredTask(filter)函数的按钮)。我有一个结果。状态=-1。根据Fiddler和Chrome在开发工具中的网络选项卡,请求状态为200,但已被取消。我也检查了后端
问题内容: 我在理解剩余拦截器注释如何添加不同的值(稍后在过滤器中看到)方面有些挣扎。给定下面的代码,我希望一旦在过滤器中,权限值中将包含foo和bar,但是它们为空。任何帮助将不胜感激。 注解 过滤 应用配置 资源类别 日志输出如下: 15:59:55,223信息[标准输出](默认任务9)@ edu.psu.swe.fortress.poc.interceptor.FortressProtect
问题内容: 但是我使用的是Java Jersey2.4,找不到ResourceFilterFactory或ResourceFilter类的任何标志。该文档也没有提及它们。它们是否已被弃用,或者它们是否真的隐藏得很好?如果已弃用它们,我该怎么用呢?泽西岛2.4和2.5现在是否可以从ContainerRequestFilter获取资源注释? 谢谢 问题答案: 如果要基于资源方法/类上可用的注释来修改请