gpt4 book ai didi

java - 从过滤器访问 servlet 注释

转载 作者:行者123 更新时间:2023-12-04 11:34:23 25 4
gpt4 key购买 nike

我需要一个在每个 servlet 之前调用的过滤器,并检查该 servlet 是否有说明它需要身份验证的注释,例如 @ServletSecurity(@HttpConstraint(rolesAllowed={"user"}))在 Servlet 3 中。如果不是这种情况,则过滤器将返回。如果 servlet 需要身份验证,它将检查请求 token 是否具有 user角色,如果没有它会自动设置一个 NOT_AUTHENTICATED响应,甚至不通过 servlet。

这项工作必须由过滤器完成,因为我需要验证请求中的 JWT token 并将解码的 JWT 添加到请求中,以便 servlet 可以使用它的有效负载。

如何从过滤器中检查 servlet 注释?在这种情况下,我可以创建一个更简单的注释,如 @RequiresAuth在 servlet 中?因为我不需要这个项目中的角色。

是否可以在不通过 servlet 的情况下从过滤器向客户端返回未经身份验证的响应?

是否可以以编程方式将过滤器设置为第一个过滤器?

这就是我使用 Jersey 解决它的方法,但我需要一个仅使用 servlet 的解决方案:

@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

@Context
private ResourceInfo resourceInfo;

@Override
public void filter(ContainerRequestContext context) {
final Method method = resourceInfo.getResourceMethod();

if (method.isAnnotationPresent(PermitAll.class)) return;
if (method.isAnnotationPresent(DenyAll.class)) {
context.abortWith(Response.status(Response.Status.FORBIDDEN).build());
return;
}

final RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
if (rolesAnnotation == null) return;
}
}

最佳答案

How do I check for servlet annotations from a filter? In that case, could I create a simpler annotation like @RequiresAuth in the servlet? Because I don't need roles in this project.


这是可能的,但不建议这样做。过滤器旨在有选择地应用于需要它们的 servlet。在您的情况下,我只会将它映射到那些需要身份验证的 servlet。
在您的 Jersey 示例中, AuthenticationFilter 适用于所有端点。使用 servlet 过滤器,您可以决定要将此过滤器应用于哪些 servlet/url-patterns。内省(introspection)注解在这里不再有意义。

Is it possible to return a not authenticated response to the client from the filter without going through the servlet?


是的。您通过调用 response.setStatus(401) 而不是 chain.doFilter 从过滤器返回。
if (isAuthenticated()) {
// this proceeds to the next filter or servlet in the chain
chain.doFilter(request, response);
}
else {
// this returns the response to the client
response.setStatus(401);
}

Is it possible to set the filter to be the first one programmatically?


是的。通过注解是不可能的,但是通过 web.xml 是可能的。这只是任何给定 servlet 或 url-pattern 的元素顺序。
<filter>
<filter-name>filter1</filter-name>
<filter-class>filter.Filter1</filter-class>
</filter>

<filter>
<filter-name>filter2</filter-name>
<filter-class>filter.Filter2</filter-class>
</filter>

<!-- filter2 will be applied 1st because it's listed 1st -->
<filter-mapping>
<filter-name>filter2</filter-name>
<servlet-name>some-servlet</servlet-name>
</filter-mapping>

<!-- filter1 will be applied after filter2 -->
<filter-mapping>
<filter-name>filter1</filter-name>
<servlet-name>some-servlet</servlet-name>
</filter-mapping>

关于java - 从过滤器访问 servlet 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42845368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com