gpt4 book ai didi

spring - Jersey中是否有类似于Spring的HandlerInterceptor的Interceptor

转载 作者:行者123 更新时间:2023-12-03 21:40:09 24 4
gpt4 key购买 nike

我需要 Jersey 2.x 中的拦截器,它提供对请求、响应和与 Web 服务路径匹配的方法的引用。

类似于 处理程序拦截器 Spring 。

要求:

  • 需要在类 上使用注释- 执行以下检查,仅当需要由 jersey 调用的相应方法未使用自定义注释进行注释时。
  • 请求 - 获取/设置属性并获取 session 对象以验证用户。
  • 回复 - 即使在调用相应的方法之前,任何验证都失败时重新定向调用。

  • Spring 等效代码:
    public class WebServiceInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    try {
    SkipWebServiceIntercept skipWebService = handler.getClass().getAnnotation(SkipWebServiceIntercept.class);

    if (skipWebService != null) {
    return Boolean.TRUE;
    }

    ...

    if(securityFails)
    {
    if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    String json;
    ...
    out.println(json);
    return Boolean.FALSE;
    }
    else {
    response.sendRedirect(redirectUrl);
    }
    }
    else
    {
    return Boolean.TRUE;
    }
    }catch (Exception e) {
    log.error("Exception in preHandle, redirecting to Login page", e);
    return LoginUtil.redirectToLogin(request, response);
    }
    }
    }

    我找到了引用
  • 阅读器拦截器 - 这仅提供类的注释。无法访问请求/响应。
  • ContainerRequestFilter - 提供请求对象但没有注释/响应。
  • 容器响应过滤器 - 给出请求和响应。但是在调用 web-service/Method 之后。

  • 有没有其他方法可以在不使用过滤器的情况下实现这一点。因为仅当存在相应的 Web 服务时,我才需要进行此处理。
    另一方面,带有/* 的过滤器将始终执行这些验证,即使未找到资源也是如此。

    编辑:
    感谢@peeskillet answer这就是我实现它的方式。
    @Provider
    public class ResourceInterceptor implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {

    System.out.println("Resource Interceptor called");

    if (resourceInfo.getResourceClass() != null
    && resourceInfo.getResourceClass().getAnnotation(SkipWebServiceIntercept.class) != null)
    return;

    context.register(LoginFilter.class);
    }

    }


    @Slf4j
    public class LoginFilter implements ContainerRequestFilter {

    @Context
    private HttpServletRequest request;

    @Context
    private ServletContext servletContext;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
    try {


    WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);

    CookieAuthenticator cookieAuthenticator = springContext.getBean(CookieAuthenticator.class);

    HttpSession session = request.getSession(true);

    ...

    // Sending JSON/Object back as response


    ...
    String json = gson.toJson(resposeJson);

    Response response = new ResponseBuilderImpl().encoding(StandardCharsets.UTF_8.name())
    .type(MediaType.APPLICATION_JSON).entity(json).build();
    requestContext.abortWith(response);
    ...

    // or Sending URL back


    ...
    URI uri = new URI(baseUrl + redirectUrl + "?refback=" + url);
    requestContext.abortWith(Response.temporaryRedirect(uri).build());
    ...

    这两种方法都运行良好,类似于 Spring 的 HandlerInterceptor。

    最佳答案

    Is there anyother way this can be achieved without using Filters. because I need this processing to happen ONLY if the corresponding web-service is present. Filter's with /* on the other hand would always perform these validations even when the resource was not found.



    有多种注册过滤器的方法。
  • 只需正常注册它,结果就是过滤器总是被调用。 (你不想要的)。
  • 使用注释注册,但 name binding .这样,只有带注释的资源才会通过过滤器。 (这是你想要的,唯一的问题是你需要注释每个类)
    @Target({TYPE, METHOD})
    @Retention(RetentionPolicy.RUNTIME);
    class @interface Filtered {}

    @Path("..")
    @Filtered
    public class YourResource {}

    @Filtered
    @Provider
    public class YourFilter implements ContainerRequestFilter {}
  • Use a DynamicFeature以编程方式而不是声明方式绑定(bind)资源。 DynamicFeture将为您的每个资源方法调用,因此您只需为每个调用注册过滤器。这与使用名称绑定(bind)注释每个资源类(如上所述)具有相同的效果(这可能是您想要的)。
    @Provider
    public class MyFeature implements DynamicFeature {
    @Override
    public void configure(ResourceInfo ri, FeatureContext ctx) {
    ctx.register(YourFilter.class);
    }
    }

  • 另见:
  • Chapter 10. Filters and Interceptors
  • 关于spring - Jersey中是否有类似于Spring的HandlerInterceptor的Interceptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35727497/

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