从@webservlet urlpattern java中排除css、js和img文件

qf9go6mv  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(463)

我的servlet按slug显示产品详细信息

@WebServlet("/*")
public class ProductDetails extends HttpServlet {

例如:
mywebsite.com/product-name
但是他们不能加载css,js和img文件,因为它检测到一个slug的pathinfo。
如何排除它们而不加载到servlet中?

ezykj2lf

ezykj2lf1#

不幸的是,servlet规范没有为url模式Map定义排除规则。此外,匹配路径优先于匹配后缀(参见Servlet4规范,第12.1和12.2段)。这个servlet上的Map将匹配应用程序上下文路径中的任何内容,包括静态资源。
你能做什么:
您可以分割逻辑来处理该servlet中的静态资源。我不赞成这样做,它可能会使代码复杂化并损害关注点的分离。
如果你的静态资源在一个特定的目录中,没有slug会匹配它(例如,所有js,css,html,图片文件在 assets/ ),您可以有另一个servlet来服务这个目录下的静态内容(例如。 @WebServlet("/assets/*") ). 匹配请求的最长路径Map优先。您仍然需要编写将文件发送回客户端的代码;这段代码相当简单,您有机会自定义静态文件的头(例如缓存),而且,与以前的解决方案相比,处理静态文件的代码位于它自己的servlet中,因此可以很好地分离关注点。
如果您不想为自己提供静态文件而烦恼(我不会责怪您),您可以将逻辑从servlet移动到另一个类。然后引入一个servlet过滤器,它将首先检查请求是否是静态资源的get,如果是,则只调用 filterChain.doFilter(request,response) 并让应用服务器处理静态文件。如果没有,它将调用您的逻辑并发送servlet本应发送的响应。
最后,如果您通过 @WebServlet("/") (不是 "/*" ). 它将接收其他servlet不接收的任何请求。应用服务器应该为静态内容安装一个servlet,该servlet将为应用程序中的任何现有css、js等文件提供服务。其他任何内容最终都会出现在默认的servlet中。
如果您能找到一种将静态内容与动态内容分开的方法,例如 assets/ ,虚拟路径下的所有动态内容 content/ 将servlet的Map更改为 /content/* 就这样吧。

相关问题