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

Если я привяжу мое приложение весны для обработки всех входящих запросов (‘/ *’), тогда запросы на статический контент возвратят 404. Например, запрос «myhost.com/css/global.css» вернет 404, хотя ресурс существует, поскольку Spring перехватывает запрос.

Альтернативой является сопоставление SpringMVC с подкаталогом (например, ‘/ home / ‘), но в этом случае вы должны передать этот каталог во все ссылки в приложении. Есть ли способ сопоставить SpringMVC с ‘/ ‘ и исключить из списка набор каталогов?

Моя текущая конфигурация web.xml:

 springApp org.springframework.web.servlet.DispatcherServlet 2   springApp /home/*  

Идеализм Я хотел бы, чтобы отображение было примерно следующим:

   springApp /* /css/*,/js/*  

Возможно ли это?

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

  1. Вам нужно будет использовать SimpleUrlHandlerMapping, для которого вы можете явно указать шаблоны URL, которые должны быть сопоставлены с controllerами или распространять его, чтобы поддерживать «игнорировать» URL-адреса, такие как «css / **».
  2. Вам нужно будет написать собственную реализацию HttpRequestHandler , которая в основном будет состоять из «getServletContext (). GetRequestDsipatcher (). Include ()», чтобы вернуть запрошенный ресурс как есть.
  3. Вам нужно будет зарегистрировать этот обработчик как defaultHandler для вышеуказанного SimpleUrlHandlerMapping.

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

ПРИМЕЧАНИЕ. Этот ответ относится к Spring 3.0.4+ ТОЛЬКО

(Кстати, этот вопрос также рассматривался здесь: Spring, обслуживающий статический контент с помощью mvc: resources, invalid xsd )

Проверьте проект Spring mvc-showcase в хранилище выборок Spring subversion . Он показывает, что именно вы хотите сделать, а именно, что вы можете очертить статические ресурсы, которые не будут обрабатываться с помощью DisapatcherServlet. См. Файл /mvc-showcase/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml . Вот fragment того, как я обрабатываю эти исключения, где JS, CSS и изображения находятся в корне контекста приложения (с пространством имен MVC, отображаемым в mvc :

     

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

  MyApp org.springframework.web.servlet.DispatcherServlet   MyApp /    default *.css   default *.js   default *.jpg   по  MyApp org.springframework.web.servlet.DispatcherServlet   MyApp /    default *.css   default *.js   default *.jpg   по  MyApp org.springframework.web.servlet.DispatcherServlet   MyApp /    default *.css   default *.js   default *.jpg   по  MyApp org.springframework.web.servlet.DispatcherServlet   MyApp /    default *.css   default *.js   default *.jpg   

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

Самый простой способ для меня (если использовать достаточно позднюю версию Spring)

   ... 

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

web.xml:

  fileTypeFilter foo.FileTypeFilter /*  

Класс 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 : в спецификации сервлета нет каких-либо исключающих функциональных возможностей. Я не думаю, что есть хороший способ сделать это в течение весны, но он по сути достигает того же самого в вашем посте.

EDIT 2 : Если вы хотите легко изменить то, что фильтруется, вы можете просто использовать Spring для ввода чего-то в фильтр во время выполнения.

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

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

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

 JkUnMount /*.css webapp 

Где «webapp» – это запись из ваших рабочих.

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

У меня такая же проблема, и вот как я ее решил:

В файл web.xml добавлено следующее:

  default *.js *.css *.ico *.png *.jpg *.htc *.gif *.html *.htm  по  default *.js *.css *.ico *.png *.jpg *.htc *.gif *.html *.htm  

Следующее было добавлено в файл определения файла сервлета spring3 MVC (такой как applicationContext.xml, файл, который настроен в web.xml как contextConfigLocation.):

   

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

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

Обычно крупные веб-сайты предпочитают использовать другой сервер только для обработки статического контента. Запросы статического содержимого отправляются на один сервер, а динамический – на другой (с пружиной в этом случае).

Во многих случаях сервер Nginx (http://nginx.com/), недавний и очень быстрый сервер.

Но это не так уж и сложно. Много конфигураций.

Я использую виртуальный путь URL для получения необходимого мне ресурса. Обычно я использую Spring MVC, поэтому у меня не было javascripts и css под папкой / WEB-INF / views. Я придумал этот настраиваемый сервлет, чтобы ТОЛЬКО разрешать доступ к файлам .js & .css в папке / WEB-INF / views. В вашем случае, если вы переместите папку / css и / js в родительскую папку, такую ​​как / resource, мое решение будет применимо к вам.

Вы можете изменить строковый url = “YOUR_RESOURCE_FOLDER”

Так, например, виртуальный путь может быть похож на http://www.mysite.com/resources/path/path/app.js

Это будет отображаться в моем /WEB-INF/views/path/path/app.js

web.xml

  ResourceDispatcherServlet mywebapp.web.ResourceDispatcherServlet   ResourceDispatcherServlet /resource/*  

сервлет

 public class ResourceDispatcherServlet extends HttpServlet { public void init() throws ServletException { } public void doGet(HttpServletRequest req, HttpServletResponse rsp) throws ServletException, IOException { String servletPath = req.getServletPath(); // /resource String pathInfo = req.getPathInfo(); // /path/path/app.js String url = "/WEB-INF/views" + pathInfo; String lastPath = StringUtil.substringAfterLast(pathInfo, "/"); String extension = StringUtil.substringAfterLast(lastPath, "."); try { RequestDispatcher dispatcher = null; if (!StringUtil.isEmpty(extension) && ("js".equals(extension) || "css".equals(extension))) { dispatcher = req.getRequestDispatcher(url); } if (dispatcher != null) { dispatcher.include(req, rsp); } else { rsp.sendError(404); } } catch (Exception e) { if (!rsp.isCommitted()) { rsp.sendError(500); } } } } 

Если вы используете Spring 3.0.4 и выше, вы должны использовать решение, предоставляемое atrain

В противном случае вы можете сделать это просто :

возможно, у вас есть статическая структура каталогов, которую вы хотите обслуживать:

 WebContent | WEB-INF | public | css | js | img 

Eclipse Динамические веб-проекты по умолчанию генерируют следующую структуру: WebContent/WEB-INF . Переместите WebContent папку из своего каталога WEB-INF в каталог WebContent .

На стороне клиента

ссылайтесь на свои статические файлы следующим образом:

  

Вот моя рекомендация.

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

   ^/img/(.*)$ /img/$1   ^/js/(.*)$ /js/$1   ^/css/(.*)$ /css/$1   ^/(.*)$ /app/$1   /app/(.*)$ /$1   

ЗАМЕТКИ:

  • Важно, чтобы последнее было внизу, поэтому img, js, css будут пойманы первыми
  • является обязательным и должен только
    render /some вместо /app/some

В моем случае все было в порядке. Но у меня проблема в controllerе

это была моя проблема @RequestMapping (method = RequestMethod.GET)

y измените для этого:

 @RequestMapping(value = "/usuario", method = RequestMethod.GET) 

и он работает

найдите controller, который имеет плохое @RequestMappgin и изменится.

  • Setter DI или Constructor DI весной?
  • Spring + Web MVC: dispatcher-servlet.xml и applicationContext.xml (плюс общая безопасность)
  • Загрузка файлов с помощью API-интерфейса Angular2 в REST
  • Безопасность Springboot не работает
  • Как установить заголовок «Принять:» в запросе Spring RestTemplate?
  • Spring Boot JPA - настройка автоматического повторного подключения
  • Отключить безопасность для модульных тестов с весенней загрузкой
  • @Value не разрешается при использовании annotations @PropertySource. Как настроить PropertySourcesPlaceholderConfigurer?
  • Как использовать Spring Security без сеансов?
  • Каковы преимущества контейнеров для инъекций зависимостей?
  • Как избежать исключения «Circular view path» с использованием теста Spring MVC
  • Давайте будем гением компьютера.