【问题标题】:How to process / URL while having default processing for /js,/css,如何在对 /js、/css 进行默认处理的同时处理 / URL,
【发布时间】:2014-07-28 03:11:54
【问题描述】:

对于 Web 应用程序,我需要通过默认处理从我的 Web 应用程序开发树 ./js、./css 中的相应文件夹中提供所有 .js、.css 和所有图像。 所以任何网址都像

http://www.example.com/js/x.js

应该直接从战争中的静态文件中提供。

主 servlet 应该处理所有不属于上述的请求。 我需要能够处理类似的请求

http://www.example.com/PROJ/ELEM/WHATEVER

具有相同的唯一主 servlet。

所以我想我会在 web.xml 中这样做:

<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>/css/*,/js/*,/WEB-INF/*</url-pattern>
</servlet-mapping>

并像这样映射主 servlet 以在 JSP 文件中创建一些 JSTL 模块:

@WebServlet(urlPatterns="/*")
public class Main extends HttpServlet {
    protected void processRequest(HttpServletRequest request, 
                                  HttpServletResponse response)
            throws ServletException, IOException {
        request.setAttribute("test", "ok");
        request.getRequestDispatcher("/WEB-INF/index.jsp")
                            .forward(request, response);        
    }
}

当我这样做时,我最终会陷入递归循环。

有没有办法做到这一点?

【问题讨论】:

  • 检查此链接:- stackoverflow.com/questions/870150/… 我认为它会帮助你。
  • @RahulJain 感谢您的建议。该问题的公认答案对我不起作用,但下一个(30+ 票)对我有用。您能否将其作为答案,以便我对其进行投票并进一步解释?谢谢

标签: java servlet-3.0


【解决方案1】:

【讨论】:

  • 这对我有用。总之:定义一个全局过滤器,您可以在其中检测静态路径并使用 chain.doFilter 将其重定向到默认 servlet,然后使用 forward
【解决方案2】:

这是已经发生的事情。有一个“默认 servlet”可以处理任何未专门映射到已安装 servlet 的请求。

【讨论】:

  • 感谢@EJP - 但我的主 servlet 必须映射到“/”。因此我的问题。
【解决方案3】:

Rahul Jain 的答案的一个简单变化。你可以做 spring MVC 对静态资源所做的事情:DispatcherServlet 是一个包罗万象的东西,它被配置为委托给默认 servlet 获取数字或 url。这对于 catch all servlet 可能很有趣,因为它通常被设计为前端控制器,将实际服务委托给其他控制器(无论是否为 servlet)。

您可以简单地在名称为 static_path_prefixes 的上下文参数中以逗号分隔的字符串中提供静态资源的 url 前缀并将其放入您的 servlet 中:

String[] staticPathPrefixes;
RequestDispatcher defaultDispatcher;

@Override
protected void service(HttpServletRequest hsr, HttpServletResponse hsr1) throws ServletException, IOException {
    String path = hsr.getServletPath();
    for (String url: staticPathPrefixes) {
        if (path.startsWith(url)) {
            defaultDispatcher.forward(hsr, hsr1);
            return;
        }
    }
    super.service(hsr, hsr1);
}

@Override
public void init() throws ServletException {
    String urls = getServletConfig().getInitParameter("static_path_prefixes");
    staticPathPrefixes = urls.split(" *, *");
    defaultDispatcher = getServletConfig().getServletContext().
            getNamedDispatcher("default");
}

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2022-07-06
    • 2011-08-19
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多