2種類のRESTサービスを開発しています。
- ログインする前に、セッション トークンは HTTP ヘッダーに渡されません。
- ログインセッショントークンが各リクエストで渡された後。
すべての REST メソッドに @HeaderParam を含めたくありません。最初に傍受したいので、それに基づいてセッションの有効性を確認したいと思います。私にお知らせください
- RESTEasy でヘッダーに基づいてインターセプトする方法
- いくつかのメソッドをインターセプトしないようにする方法
ありがとう。
PreProcessInterceptor を使用してこの問題を解決しました
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Securable {
String header() default "session-token";
}
@Provider
@ServerInterceptor
public class ValidationInterceptor implements PreProcessInterceptor, AcceptedByMethod {
@Context
private HttpServletRequest servletRequest;
@Override
public boolean accept(Class clazz, Method method) {
return method.isAnnotationPresent(Securable.class);
}
@Override
public ServerResponse preProcess(HttpRequest httpRequest, ResourceMethod resourceMethod) throws Failure,
WebApplicationException {
Securable securable = resourceMethod.getMethod().getAnnotation(Securable.class);
String headerValue = servletRequest.getHeader(securable.header());
if (headerValue == null){
return (ServerResponse)Response.status(Status.BAD_REQUEST).entity("Invalid Session").build();
}else{
// Validatation logic goes here
}
return null;
}
}
アノテーション @Secible は、検証が必要な REST サービスで使用されます。
@Securable
@PUT
public Response updateUser(User user)
2つのアプローチがあります
JAX-RS インターセプターを使用する- インターセプターでリクエスト オブジェクトにアクセスできるため、ヘッダーを読み取ることができます
古き良き JavaServlet フィルターを使用してください - JAX-RS を使用していることは問題ではありません。REST 要求もフィルタリングできます。インターセプターと同様に、フィルターはヘッダー情報を持つリクエスト オブジェクトにアクセスできます。
どちらの場合も、HttpSession が存在する (request.getSession()
メソッド) かどうか、および必須の属性があるかどうかを確認できます。
リクエストパスを見て、Javaコードで構成またはプログラムでフィルタリングされたリクエストを含めたり除外したりできます。