<url-pattern> 过滤器映射无效

<url-pattern> in filter mapping is not valid

我有一个@POST 休息方法,我想为它制作过滤器,所以只有登录到应用程序的人才能访问它。 这是我的@POST 方法:

@POST
@Path("/buy")
public Response buyTicket(@QueryParam("projectionId") String projectionId, @QueryParam("place") String place){
    Projection projection = projectionDAO.findById(Long.parseLong(projectionId));
    if(projection != null){
        System.out.println(projection.getMovieTitle());
        System.out.println(place);
        projectionDAO.buyTicket(projection, userContext.getCurrentUser(), place);
    }

    return Response.noContent().build();
}

这是我为此方法编写的过滤器:

@WebFilter("rest/projection/buy")
public class ProtectedBuyFunction implements Filter {
@Inject
UserContext userContext;

public void init(FilterConfig fConfig) throws ServletException {
}

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    if (!isHttpCall(request, response)) {
        return;
    }
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    User currentUser = userContext.getCurrentUser();
    if (currentUser == null) {
        String loginUrl = httpServletRequest.getContextPath()
                + "/login.html";
        httpServletResponse.sendRedirect(loginUrl);
        return;
    }
    chain.doFilter(request, response);
}

private boolean isHttpCall(ServletRequest request, ServletResponse response) {
    return (request instanceof HttpServletRequest)
            && (response instanceof HttpServletResponse);
}

public void destroy() {
}}

问题是我总是遇到异常并且服务器拒绝启动,异常是:

Invalid <url-pattern> rest/projection/buy in filter mapping

我正在使用带有 Jax-RS 的 TomEE 服务器。有什么办法可以解决这个问题吗?

最简单的方法是使用 JAX-RS 过滤器而不是 Servlet 过滤器。你可以在这里找到它们的文档:https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e9580

如果是您的 Servlet 过滤器,请 post 您的 servlet 上下文以及 JAX-RS 资源的映射是什么,以便找出您收到错误的原因。

根据 servlet 规范的映射路径应遵循以下规则:

  • 目录映射:以‘/’字符开头,以‘/*’后缀结尾的字符串用于路径映射。
  • 扩展名映射:以“*.”前缀开头的字符串用作扩展名映射。
  • 上下文根: 空字符串 ("") 是一个特殊的 URL 模式,它精确地映射到 应用程序的上下文根,即 http://host:port// 形式的请求。在这种情况下,路径信息是“/”,servlet 路径和上下文路径是空字符串(“”)。
  • Default Servlet: 仅包含'/'字符的字符串表示应用程序的"default" servlet。在这种情况下,servlet 路径是请求 URI 减去上下文路径,路径信息为空。
  • 精确映射:所有其他字符串仅用于精确匹配。

在您的情况下,它不是以“/”开头。如果您使用的是 servlet 过滤器,则上下文根应该具有绝对 url。在开头添加“/”。应该可以。