Servlet Mapping: Только когда файл или каталог не существует? - PullRequest
0 голосов
/ 09 декабря 2010

Я настраиваю веб-приложение на GlassFish, и мне интересно, есть ли способ настроить отображение сервлета из корня URL-адреса для применения только в тех случаях, когда файл или каталог не существует по указанному URL-адресу.

В настоящее время все будет перенаправлено через диспетчер Spring:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
           version="3.0">
 <servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
  <welcome-file>
   /jsp/index.jsp
  </welcome-file>
 </welcome-file-list>
</web-app>

Возможно ли каким-либо образом сохранить вышеуказанное поведение, если файл или каталог не существует по заданному пути? Я пытаюсь решить эту проблему не в том месте?

ОБНОВЛЕНИЕ: Как насчет перезаписи URL? Обеспечивает ли GlassFish какую-то степень гибкости, как Apache с mod_rewrite? Таким образом, я мог бы перехватить вещи еще до того, как они достигнут стадии отображения сервлета.

1 Ответ

1 голос
/ 09 декабря 2010

Хаки, но выполнимо: сопоставьте его как <error-page> на <error-code> из 404.

<servlet>
    <servlet-name>errorServlet</servlet-name>
    <servlet-class>com.example.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>errorServlet</servlet-name>
    <url-pattern>/error</url-pattern>
</servlet-mapping>

<error-page>
    <error-code>404</error-code>
    <location>/error</location>
</error-page>

Возможно, вы захотите изменить код состояния в сервлете всякий раз, когда вы хотите вернуть«действительный» ответ.

Альтернатива - позволить сервлету Spring прослушивать более конкретный url-pattern.Например, /pages/*.Затем вы могли бы при необходимости вывести Filter вперед (на /*), что примерно соответствует следующему:

if (new File(servletContext.getRealPath(request.getRequestURI())).exists()) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/pages" + request.getRequestURI()).forward(request, response);
}

, чтобы вы не видели / не нуждались /pages в URL.


Обновление : согласно вашему новому вопросу:

ОБНОВЛЕНИЕ: Как насчет перезаписи URL?Обеспечивает ли GlassFish какую-то степень гибкости, как Apache с mod_rewrite?Таким образом, я мог бы перехватывать вещи до того, как они достигнут стадии отображения сервлета.

JSP / Servlet эквивалент аддона Apache HTTPD mod_rewrite - это Tuckey UrlRewriteFilter.

...