有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java servlet:frontController的URL模式`/`覆盖默认的静态文件服务

我正在使用tomcat的gretty和running应用程序

我唯一的servlet是:

@WebServlet(name = "frontServlet", urlPatterns = arrayOf("/"))
class FrontServlet : HttpServlet() {
    override fun doGet(req: HttpServletRequest, resp: HttpServletResponse) {
        Router.doGet(req, resp)
    }
    ...
}

我的静态资产在WebContent/public

但任何请求(包括指向资产的路径)都由FrontServlet处理

如果我将FronServlet的url模式设置为特定的模式,则默认静态服务可以工作(但我需要它来捕获除对静态文件的请求之外的所有请求)

我应该怎么做?有没有办法从自定义servlet调用服务器的默认静态文件处理程序


共 (1) 个答案

  1. # 1 楼答案

    在与如此古老的技术进行斗争并使用其他一些答案后,我找到了两种解决方案: 1.在FrontServlet doGet方法中:

    if (req.requestURI.startsWith("/static/") || req.requestURI.startsWith("/favicon.ico")) {
        req.session.servletContext.getNamedDispatcher("default").forward(req, resp)
    } else {
        Router.doGet(req, resp)
    }
    
    1. 编写一个筛选器:

    @WebFilter(filterName=“frontFiletr”,urlPatterns=arrayOf(“/*”)

    类FrontFilter:筛选器{

        override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
            val path = (request as HttpServletRequest).requestURI
            if (path.startsWith("/static/")) {
                chain.doFilter(request, response)
            } else {
                request.session.servletContext.getNamedDispatcher("frontServlet").forward(request, response)
            }
        }
    

    }