2

次のようなインターセプターがあります

@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値を追加する必要があります
- オリジナルrequestはリクエスト ヘッダーにアクセスでき、ヘッダーの 1 つは次の形式です

signature:user:expires
  • 新しい時間ベースのトークンを生成するには、userこのヘッダーを形成するためのアクセスが必要ですrequest

requestヘッダーにアクセスするにはどうすればよいですか?

4

1 に答える 1

1

追加した

@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
于 2013-08-26T21:34:41.933 に答える