当前位置: 首页 > 知识库问答 >
问题:

使用Hystrix Java Servlet&在Jersey 2中使用Servlet过滤器

屠嘉
2023-03-14
@Path("/hystrix.stream")
public class HystrixResource extends HystrixUtilizationSseServlet {

    @Context
    HttpServletRequest httpRequest;

    @Context
    HttpServletResponse httpResponse;

    //This returns void because it is a text/stream output that must remain open, 
    //so the httpResponse is continually written to until the conenction is closed
    @GET
    public void doGet() throws ServletException, IOException {
        doGet(httpRequest, httpResponse);
    }
}

这可能起作用,但由于某种原因,数据基本上是空的。我猜原因是因为过滤器不起作用。

data: {"type":"HystrixUtilization","commands":{},"threadpools":{}}

我不太清楚如何包装Servlet过滤器,因为它们与Jersey ContainerRequestFilter期望不同的输入和输出。JerseyConfig中的以下实现似乎什么也不做,因为日志没有指示筛选器正在注册,而且在调试模式下不能中断这些文件中的行。

@Component
@ApplicationPath("/")
public class JerseyConfig extends ResourceConfig {
    private static final Logger LOGGER = Logger.getLogger("JerseyConfig");
    public JerseyConfig(){
        //filter to provide a bridge between JAX-RS and Spring request attributes
        register(RequestContextFilter.class);
        register(SpringComponentProvider.class);
        //handles custom serialization
        register(new ObjectMapperContextResolver());
        //try to register the filters - which doesn't work because these aren't Jersey Filters
        register(HystrixRequestContextServletFilter.class);
        register(HystrixRequestLogViaResponseHeaderServletFilter.class);
        registerResources();

        /*
         * Enable the logging filter to see the HTTP response for each request.
         */
        register(new LoggingFilter(LOGGER, true));
    }
}

共有1个答案

欧阳俊晖
2023-03-14

Servlet和Servlet过滤器不应该注册在Jersey配置中。他们将被忽视。相反,您应该使用Spring Boot使用ServletRegistrationBeanFilterRegistrationBean注册它们。

在Spring配置中,可以执行如下操作

@Bean
public ServletRegistrationBean someServlet() {
    ServletRegistrationBean registration = ServletRegisrationBean(
            new HystrixMetricsStreamServlet(), "/hystrix.stream");
    registration.setName("HystrixMetricsStreamServlet");
    return registration;
}

@Bean
public FilterRegistrationBean someFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new HystrixRequestContextServletFilter());
    registration.setUrlPatterns(Arrays.asList("/*"));
    registration.setName("HystrixRequestContextServletFilter");
    // you can also set the order of filters if you need to 
    return registration;
}

还有:

    null
 类似资料:
  • 问题内容: 我想在我的JSF应用程序中上传文件。我正在使用和访问上载文件。 但是,返回一个空集合。如何在Tomcat7.0.8中的Servlet过滤器中启用解析? 问题答案: 为了获得在一个工作在Tomcat中,您需要设置在webapp的元素或。 因为根据Servlet3.0规范,该属性只能在带有注释的内使用。另请参阅元素的文档: 设置为Tomcat是否应在调用或时自动解析请求主体,即使目标ser

  • 问题内容: 现有的Web应用程序正在Tomcat 4.1上运行。页面存在XSS问题,但是我无法修改源代码。我决定编写一个servlet过滤器以在页面看到参数之前对其进行清理。 我想这样编写一个Filter类: 但是ServletRequest.setParameter不存在。 在将请求向下传递之前,如何更改请求参数的值? 问题答案: 如前所述,没有setParameter方法。这是故意的,因为该类

  • 下面的代码被修改为不包括我的数据库中的任何数据。 然后将其传递到initialize方法中,在该方法中进行表的实际填充。 顺便说一下,Users类如下所示: 该程序按预期工作,我可以看到与图像和VBox的详细信息的表格。 现在我想添加一个TextField来过滤表,过滤参数是标签中的文本。 我明白了,我需要将ObservableList放入FilteredList中,然后放入SortedList中

  • 我正在研究一个合作医疗系统。 我的代码在url调用的servlet的

  • 问题内容: 如何使用Servlet过滤器来更改来自的传入Servlet请求网址 至 ? 问题答案: 实施。 在方法中,将传入内容强制转换为。 用抢的路径。 使用简单的方法,如,,c等提取感兴趣的部分,构成了新的路径。 使用或然后将请求/响应转发到新的URL(服务器端重定向,不反映在浏览器地址栏中),或将传入的内容强制转换为然后将响应重定向到新的URL(客户端重定向,反映在浏览器地址栏)。 注册过滤

  • 作为基础了解,在web应用程序范畴内使用 FreeMarker 和其它并没有什么不同; FreeMarker将它的输出写入传递给 Template.process 方法的 Writer 对象,它不关心 Writer 将输出写入控制台,文件或是 HttpServletResponse 的输出流。 FreeMarker 并不知道什么是servlet和web;它仅仅是使用模板文件来合并Java对象, 之