我正在開發兩種類型的REST服務。基於RESTeasy中的HTTP頭進行攔截
- 登錄前沒有會話標記將被傳遞給HTTP標頭。
- 登錄後會話令牌將在每個請求中傳遞。
我不想在每個REST方法中包含@HeaderParam。我想先攔截它,並基於此我想檢查會話的有效性。請讓我知道
- 我如何進行攔截基於標題中的RESTEasy
- 如何避免攔截幾個方法
感謝。
我正在開發兩種類型的REST服務。基於RESTeasy中的HTTP頭進行攔截
我不想在每個REST方法中包含@HeaderParam。我想先攔截它,並基於此我想檢查會話的有效性。請讓我知道
感謝。
我解決了使用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;
}
}
@Securable將其上有待進一步驗證REST服務中使用的標註這個問題。
@Securable
@PUT
public Response updateUser(User user)
有兩種方法
使用JAX-RS interceptors - 您可以訪問請求對象的攔截器,這樣你就可以讀頭
使用好老JavaServlet過濾器 - 這是不是一個問題您正在使用JAX-RS,您也可以過濾REST請求。同樣地攔截器,過濾器可以訪問請求對象,這標題信息
在這兩種情況下,可以檢查是否存在的HttpSession(request.getSession()
法),它已經必要的屬性。
您可以包含/排除通過配置或編程方式在Java代碼中過濾的請求,查看請求路徑。
如果您使用的是Jersey,則創建一個註釋'x',並在註釋中提及@NameBinding。創建ContainerRequestFilter並將註釋「x」添加到此過濾器。現在用'x'註釋來裝飾你的服務 – jaks 2015-04-28 05:12:24