<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。在开头添加“/”。应该可以。
我有一个@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。在开头添加“/”。应该可以。