我有一个@POST rest方法,我想为它做过滤,所以只有登录在应用程序中的人才能访问它。 这是我的@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服务器。有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
根据servlet规范的映射路径应遵循以下规则:
在您的情况下,它不以&#34; /&#34;开头。如果使用servlet过滤器,则应该具有上下文根的绝对URL。添加&#34; /&#34;在一开始的时候。它应该工作。
答案 1 :(得分:0)
最简单的方法是使用JAX-RS过滤器而不是Servlet过滤器。你可以在这里找到它们的文档:https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e9580
如果是Servlet过滤器,请发布您的servlet上下文以及JAX-RS资源的映射,以便找出出现错误的原因。