java - 后处理拦截器 : How to access HTTP request?

标签 java jakarta-ee authentication java-ee-6 resteasy

我有一个拦截器,看起来像

@Interceptor
@Provider
@ServerInterceptor
@SecurityChecked
public class SecurityCheckInterceptor implements PreProcessInterceptor, AcceptedByMethod, PostProcessInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityCheckInterceptor.class);

    @Nullable
    @Override
    public ServerResponse preProcess(final HttpRequest request, final ResourceMethod method) throws Failure, WebApplicationException {
        final List<String> authToken = request.getHttpHeaders().getRequestHeader(AUTH_TOKEN);

        if (authToken == null || !isValidToken(authToken.get(0))) {
            final ServerResponse serverResponse = new ServerResponse();
            serverResponse.setStatus(Response.Status.UNAUTHORIZED.getStatusCode());
            return serverResponse;
        }

        return null;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean accept(final Class declaring, final Method method) {
        // return declaring.isAnnotationPresent(SecurityChecked.class);
        return method.isAnnotationPresent(SecurityChecked.class);
    }

    @Override
    public void postProcess(final ServerResponse response) {
        LOGGER.info("post-processing response " + response.getEntity());
    }

}

我想要什么?
- 每次响应返回时,我都需要添加一个新的 AUTH_TOKEN
- 原始请求可以访问请求 header ,其中一个 header 的形式为

signature:user:expires
  • 我需要访问 user 形成此 request header 以生成新的基于时间的 token

我怎样才能访问请求 header ?

最佳答案

我加了

@Context HttpServletRequest servletRequest;

这让我可以访问标题。

我修改后的拦截器看起来像

@Interceptor
@Provider
@ServerInterceptor
@SecurityChecked
public class SecurityCheckInterceptor implements PreProcessInterceptor, AcceptedByMethod, PostProcessInterceptor {
    private static final Pattern PATTERN = Pattern.compile(":");
    @Context
    HttpServletRequest servletRequest;

    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityCheckInterceptor.class);

    @Nullable
    @Override
    public ServerResponse preProcess(final HttpRequest request, final ResourceMethod method) throws Failure, WebApplicationException {
        final List<String> authToken = request.getHttpHeaders().getRequestHeader(AUTH_TOKEN);

        if (authToken == null || !isValidToken(authToken.get(0))) {
            final ServerResponse serverResponse = new ServerResponse();
            serverResponse.setStatus(Response.Status.UNAUTHORIZED.getStatusCode());
            return serverResponse;
        }

        return null;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean accept(final Class declaring, final Method method) {
        // return declaring.isAnnotationPresent(SecurityChecked.class);
        return method.isAnnotationPresent(SecurityChecked.class);
    }

    @Override
    public void postProcess(final ServerResponse response) {
        final String header = servletRequest.getHeader(AUTH_TOKEN);
        LOGGER.info("post-processing response " + header);
        final String authToken = TokenUtils.createToken(PATTERN.split(header)[1]);
    }
}

在我看到的日志中

(http--0.0.0.0-9090-1) post-processing response InvalidTokenValue:user:1377552546572

关于java - 后处理拦截器 : How to access HTTP request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453222/

相关文章:

javascript - jsp上的struts项目中的自动滚动

java - 使用 jsoup 获取图像的绝对 url

java - String.chars() - 为什么这里使用 "i - ' 0'"?

java - OS X 上的简单 JMS 客户端

authentication - 未在生产中使用 express-session 设置 Cookie

Java 一维数组

java - 在哪里记录了要添加到 Maven 项目中的 JBoss EAP 运行时依赖项?

java - 使用 CDI 注入(inject)接口(interface)实现

java - Selenium Java 代码无法捕获文本框

session - 如何使用 Azure 移动服务管理用户 session ?