package edu.psu.swe.fortress.poc.interceptor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.enterprise.util.Nonbinding;
import javax.ws.rs.NameBinding;
@NameBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
public @interface FortressProtected
{
@Nonbinding String[] permissions() default {};
}
package edu.psu.swe.fortress.poc.interceptor;
import java.io.IOException;
import java.lang.annotation.Annotation;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
@Provider
@FortressProtected
public class FortressAuthorizer implements ContainerRequestFilter
{
@Override
public void filter(ContainerRequestContext requestContext) throws IOException
{
System.out.println("In the interceptor");
Class<?> clazz = this.getClass();
FortressProtected annotation = clazz.getAnnotation(edu.psu.swe.fortress.poc.interceptor.FortressProtected.class);
System.out.println("Annotation? " + clazz.isAnnotation());
for (Annotation a : clazz.getAnnotations())
{
System.out.println(a);
}
for (String s : annotation.permissions())
{
System.out.println(s);
}
}
}
package edu.psu.swe.fortress.poc.rest;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import edu.psu.swe.fortress.poc.interceptor.FortressAuthorizer;
import edu.psu.swe.fortress.poc.interceptor.FortressProtected;
@ApplicationPath("")
public class FortressTestApp extends Application
{
private Set<Class<?>> clazzez_ = new HashSet<>();
{
clazzez_.add(ResourceImpl.class);
clazzez_.add(FortressProtected.class);
clazzez_.add(FortressAuthorizer.class);
}
public Set<Class<?>> getClasses()
{
return clazzez_;
}
}
package edu.psu.swe.fortress.poc.rest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import edu.psu.swe.fortress.poc.interceptor.FortressProtected;
@FortressProtected(permissions={"foo", "bar"})
@Path("tests")
public class ResourceImpl
{
@GET
@Produces("application/text")
public String getHello()
{
FortressProtected annotation = this.getClass().getAnnotation(edu.psu.swe.fortress.poc.interceptor.FortressProtected.class);
System.out.println(annotation.toString());
return "hello";
}
}
15:59:55,223 INFO[stdout](默认任务-9)@edu.psu.swe.fortress.poc.interceptor.fortressprotected(permissions=[])15:59:55,229 INFO[stdout](默认任务-9)@edu.psu.swe.fortress.poc.interceptor.fortressprotected(permissions=[foo,bar])
提前谢了。
在你的过滤器里看这个
Class<?> clazz = this.getClass();
FortressProtected annotation = clazz.getAnnotation(FortressProtected.class);
this.getClass()
对应于过滤器类(其注释没有值)。相反,您需要获取resourceImpl
上的注释
几个选择。您可以显式地使用resourceimpl.class.GetAnnotation(...)
。但这样做的问题是,一旦绑定了多个类,如何匹配哪个类对应于哪个请求。出于这个原因,下一个选择更可行。
@Provider
@FortressProtected
public class FortressAuthorizer implements ContainerRequestFilter {
@Context
ResourceInfo resourceInfo;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
Class<?> resourceClass = resourceInfo.getResourceClass();
FortressProtected classAnnot = resourceClass.getAnnotation(FortressProtected.class);
if (classAnnot != null) {
// do something with annotation
}
Method resourceMethod = resourceInfo.getResourceMethod();
FortressProtected methodAnnot = resourceMethod.getAnnotation(FortressProtected.class);
if (methodAnnot != null) {
// do something with annotation
}
}
}
问题内容: 我在理解剩余拦截器注释如何添加不同的值(稍后在过滤器中看到)方面有些挣扎。给定下面的代码,我希望一旦在过滤器中,权限值中将包含foo和bar,但是它们为空。任何帮助将不胜感激。 注解 过滤 应用配置 资源类别 日志输出如下: 15:59:55,223信息[标准输出](默认任务9)@ edu.psu.swe.fortress.poc.interceptor.FortressProtect
本文向大家介绍Android中获取资源 id 及资源 id 的动态获取,包括了Android中获取资源 id 及资源 id 的动态获取的使用技巧和注意事项,需要的朋友参考一下 Android中获取资源 id 及资源 id 的动态获取 我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句: findViewById是我们获取layout中各
问题内容: 但是我使用的是Java Jersey2.4,找不到ResourceFilterFactory或ResourceFilter类的任何标志。该文档也没有提及它们。它们是否已被弃用,或者它们是否真的隐藏得很好?如果已弃用它们,我该怎么用呢?泽西岛2.4和2.5现在是否可以从ContainerRequestFilter获取资源注释? 谢谢 问题答案: 如果要基于资源方法/类上可用的注释来修改请
我希望通过ContainerRequestFilter中的ExtendedUriInfo检索matchedResources/matchedResults,以便检查路径是否应该受到保护。是否有一种方法可以创建一个在ExtendedUriInfo填充之后,但在调用匹配的资源类和方法之前调用的筛选器?