SpringMVC может быть настроен, чтобы обработать все запросы, но исключить статические каталоги содержания?

PHP's время () возвраты текущая метка времени Unix. С этим можно использовать дата () функция для форматирования его к потребностям.

$date = date('Format String', time());

Как Paolo, упомянутый в комментариях, второй аргумент избыточен. Следующий отрывок эквивалентен тому выше:

$date = date('Format String');

59
задан Rich Kroll 5 August 2009 в 16:24
поделиться

6 ответов

Если вы хотите сделать это только с помощью Spring, это возможно, но немного беспорядочно:

  1. Вам нужно будет либо использовать SimpleUrlHandlerMapping , для которого вы можете явно укажите шаблоны URL, которые должны быть сопоставлены с контроллерами, ИЛИ расширите его для поддержки "игнорируемых" URL-адресов, таких как "css / **".
  2. Вам нужно будет написать свою собственную реализацию HttpRequestHandler , которая будет в основном состоять из Вызов "getServletContext (). getRequestDsipatcher (). include ()" для возврата запрошенного ресурса как есть.
  3. Вам необходимо зарегистрировать этот обработчик как defaultHandler для вышеуказанного SimpleUrlHandlerMapping.

Как только все это будет сделано, все запросы, которые не могут быть сопоставлены с вашими контроллерами, будут перенаправлены на ваш HttpRequestHandler и обслуживаться «как есть».

7
ответ дан 24 November 2019 в 18:25
поделиться

Что вы используете для обслуживания своих статических изображений? Если это Apache, вы можете настроить Apache так, чтобы он не передавал запросы css / js на ваш сервер приложений.

Если вы используете Tomcat, вы должны поместить что-то вроде этого в свой httpd.conf:

JkUnMount /*.css  webapp

Где 'webapp' - это запись из вашего worker.properties.

Извините, я не могу дать вам чистое решение Spring, но я делаю это так.

2
ответ дан 24 November 2019 в 18:25
поделиться

Один из способов сделать это - использовать фильтры. Придется написать немного собственного кода, но это неплохо. Вот пример, если вы не хотите передавать файлы * .css или * .js в сервлет Spring:

web.xml:

<filter-mapping>
    <filter-name>fileTypeFilter</filter-name>
    <filter-class>foo.FileTypeFilter</filter-class>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Класс Java:

public class FileTypeFilter implements Filter {
     public void init(FilterConfig conf) {
         // init logic here
     }

     public void destroy() {
        // release resources here
     }

     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
          if(shouldExclude(req)) {
              chain.doFilter(req, res);
              //some logic so the request doesnt go to the servlet

              //maybe you could just forward
              //the request directly to the file getting accessed.  not sure if that would work
          }

          //file should be passed to the servlet; you can do some logic here
          //if you want         
     }
     private boolean shouldExclude(ServletRequest req) {
         if(req instanceof HttpServletRequest) {
             HttpServletRequest hreq = (HttpServletRequest) req;
             return (hreq.getRequestURI().endsWith(".css") ||
                     hreq.getRequestURI().endsWith(".js"));
         }
         return false;
    }
}

Я не тестировал это, но думаю он будет работать.

EDIT : В спецификации сервлета нет никакой функции исключения. Я не думаю, что в Spring есть хороший способ сделать это, но по существу он достигает того же самого в вашем сообщении.

РЕДАКТИРОВАТЬ 2 : Если вы хотите иметь возможность легко изменять то, что фильтруется, вы можно просто использовать Spring для вставки чего-либо в фильтр во время выполнения.

РЕДАКТИРОВАТЬ 3 : Я только что понял, что если вы перейдете прямо к файлу, он снова выполнит фильтрацию, и вы попадете в бесконечный цикл.

3
ответ дан 24 November 2019 в 18:25
поделиться

Есть ли у вас согласованные расширения для запросов, которые вы хотите обработать диспетчером Spring (я считаю, что большинство из примеров Spring использовать * .htm)? В этом случае вы можете сопоставить расширения, которые хотите обработать, чтобы обходить ваши файлы css и js.

В противном случае я бы согласился с Nalandial, подход фильтра, вероятно, является лучшим решением на данном этапе.

0
ответ дан 24 November 2019 в 18:25
поделиться

Я решил, обслуживая статический контент через сервлет «по умолчанию», который просто передает контент клиенту. Итак, мой файл web.xml выглядит так:

<servlet>
    <servlet-name>MyApp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyApp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping> <!-- The 'dynamic' content -->

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping> <!-- The 'static' content -->

Надеюсь, это поможет.

27
ответ дан 24 November 2019 в 18:25
поделиться

Было бы проще использовать UrlRewriteFilter для перенаправления запроса на ваш сервлет, вот пример urlrewrite.xml

<urlrewrite>
    <rule>
        <from>^/img/(.*)$</from>
        <to>/img/$1</to>
    </rule>
    <rule>
        <from>^/js/(.*)$</from>
        <to>/js/$1</to>
    </rule>
    <rule>
        <from>^/css/(.*)$</from>
        <to>/css/$1</to>
    </rule>
    <rule>
        <from>^/(.*)$</from>
        <to>/app/$1</to>
    </rule>
    <outbound-rule>
        <from>/app/(.*)$</from>
        <to>/$1</to>
    </outbound-rule>
</urlrewrite>

ПРИМЕЧАНИЯ:

  • Важно последнее <правило> находится внизу, поэтому сначала будут обнаружены img, js, css
  • не является обязательным и используется только для того, чтобы существующее
    render / some вместо / app / some
-1
ответ дан 24 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: