【问题标题】:Call ContainerRequestFilter on Tomcat's own DefaultServlet在 Tomcat 自己的 DefaultServlet 上调用 ContainerRequestFilter
【发布时间】:2017-08-03 12:39:24
【问题描述】:

按照BalusC's关于该答案的说明:

How to stream audio/video files such as MP3, MP4, AVI, etc using a Servlet

我将以下 Context 元素添加到我的 Tomcat server.xml 以使我的媒体文件可用于 Tomcat 自己的 DefaultServlet

<Context docBase="/home/jwi/media" path="/service/media" />

这就像魅力一样,媒体可在以下位置获得:

http://localhost:8080/service/media/example.mp4

我的应用程序(基于 Jersey 2.x 构建)中的 ApplicationPath 设置为:@ApplicationPath("service")

在该应用程序中,我有一个请求过滤器,用于检查每个传入请求是否存在有效的用户会话。

@Provider
@PreMatching
@Priority(1)
public class SessionFilter implements ContainerRequestFilter {

    @Context
    private ServletContext _context;
    @Context
    private HttpServletRequest _request;
    @Context
    private HttpServletResponse _response;

    public void filter(ContainerRequestContext requestContext) throws IOException {

        HttpSession session = _request.getSession(false);
        boolean isLoggedIn = session != null && session.getAttribute("username") != null;
        boolean isLoginRequest = _request.getRequestURI().contains("login");

        if (isLoggedIn || isLoginRequest) {
            // Since filter chain is invoked by @Priority annotation here's nothing to do.
        } else {
            URI indexPage = UriBuilder.fromUri("/index.html").build();
            requestContext.abortWith(Response.temporaryRedirect(indexPage).build());
        }
    }
}

我的问题是,过滤器永远不会在媒体元素上调用。因此,当我打开 http://localhost:8080/service/media/example.mp4 时,根本不会调用过滤器。

如何将 Tomcat 的 DefaultServlet 添加到我的请求过滤器中?

【问题讨论】:

    标签: java tomcat jersey jax-rs


    【解决方案1】:

    您是否考虑过使用 Servlet Filter 代替?

    @WebFilter("/service/media/*")
    public class SessionFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException {
    
            ...
    
            chain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
    
        }
    } 
    

    【讨论】:

    • 这就是我在上面的问题中提到@ApplicationPath Annoation 的原因。 ApplicationPath 设置为“服务”,server.xml 中的媒体路径也设置为“/service/media”。通常,RequestFilter 应该捕获以“服务”开头的每个请求作为请求 uri。
    • @jwi 我想我误读了你的问题。您是否尝试过 Servlet Filter
    • 我认为如果 server.xml 中的媒体路径以我的 JAX-RS 应用程序中的 ApplicationPath 开头会很好 - 这不起作用。我现在将尝试使用 Servlet 过滤器提出您的建议。 ;)
    • 实现了 WebFilter 但请求仍然没有被过滤器捕获。 ://
    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2015-11-27
    • 2019-08-21
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多