首页 > 解决方案 > 如何检查请求的 URL 是否是 servlet(在过滤器中)?

问题描述

我有一个映射到所有请求的过滤器:

@WebFilter({ "/*" })

我使用此过滤器进行 url 映射,以便我可以为我的 jsps 提供虚 url 并处理 404,但这也意味着我必须手动添加 servlet 才能正常处理请求链:

String requri = ((HttpServletRequest) request).getRequestURI(); //get requested url
String page = "";

if(requri.equals("/contact/") || requri.equals("/contact"))
   page = "contact.jsp";

else if(requri.equals("/about/") || requri.equals("/about"))
   page = "about.jsp";

else if(requri.equals("/SomeServlet"))
   chain.doFilter(request, response); //if requested url is a servlet, then carry on normally

//send requested url to servlet which will then forward user to the appropriate page
request.getRequestDispatcher("/GetPage?page="+page).forward(request, response);
return;

这一切都很好。

但是有没有办法获取所有 servlet 的 url 映射列表?这样我就不必手动列出 servlet 的每个 url 映射.. 即:

else if(requri.equals("/SomeServlet") || requri.equals("/AnotherServlet") || requri.equals("/SomeOtherServlet"))
   chain.doFilter(request, response); //if requested url is a servlet, then carry on normally

理想:

else if(isAServlet(requri))
   chain.doFilter(request, response); //if requested url is a servlet, then carry on normally

标签: javaservletsjakarta-ee

解决方案


如果您在 JEE >= JEE 7 中,则有ServletContext.getServletRegistrations(). ServletRegistration它返回一个从 servlet 名称到对象的映射。它们有一个getMappings()方法可以为您获取该 servlet 的 URL 映射。您可能需要对这些进行一些处理,例如手动应用 servlet URL 映射规则,以查看哪个 servlet(如果有)将被调用。


推荐阅读