Java Servlet - сопоставление сервлета с каждым URL-адресом, но строка

У меня есть сервлет, настроенный для обработки всех URL-адресов (*):

<servlet>
    <servlet-name>MyServ</servlet-name>
    <servlet-class>MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServ</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Мне нужно, чтобы для URLS, начинающихся с /static/, он должен обслуживать их из статического WEB-INF. То есть, MyServ должен обслуживать все, кроме /static.

Как я могу это сделать?


ОБНОВЛЕНИЕ. Чтобы уточнить, что мне нужно:

/*/ - Идет в MyServ
/static/dir/file.css - Jetty служит для статического файла file.css из /dir/.

Я не уверен, что делать с web.xml или куда ставить статические файлы.

Я попытался добавить это:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

Но, когда я перехожу к URL /static/, я просто получаю:

HTTP ERROR 404

Problem accessing /static/dir/file.css. Reason: 
    Not Found

Powered by Jetty://

Я не уверен, что мой web.xml ошибочен, или если я просто помещаю файлы в неправильное место (я пробовал в src/main/webapp и src/main/webapp/lib/META-INF/resources/)


Jetty

Я использую Jetty. Я хочу избежать других слоев, таких как Nginx, Apache и т.д.

Чтобы выиграть награду, пожалуйста, убедитесь, что вы отвечаете за работу на Jetty.

Ответ 1

Лучше всего, вероятно, иметь правило для статики, которое возникает перед правилом для *.

Правило для сопоставления URL-адресов:

Используется в следующем порядке. Первое успешное совпадение используется без дальнейших попыток.

  • Контейнер попытается найти точное соответствие пути запроса к пути сервлета. Успешное совпадение выбирает сервлет.
  • Контейнер будет рекурсивно пытаться сопоставить самый длинный префикс пути. Это делается путем постепенного изменения дерева путей в каталоге, используя символ/как разделитель путей. Наибольшее совпадение определяет выбранный сервлет.
  • Если последний сегмент пути URL содержит расширение (например,.jsp), контейнер сервлета попытается сопоставить сервлет, обрабатывающий запросы для расширения. Расширение определяется как часть последнего сегмента после последнего. характер.
  • Если ни одно из предыдущих трех правил не приводит к совпадению сервлета, контейнер будет пытаться обслуживать контент, соответствующий запрашиваемому ресурсу. Если для приложения определен сервлет по умолчанию, он будет использоваться.

Таким образом, он будет соответствовать правилу для /static/ и остановится там.

Ответ 2

Ваша проблема может быть решена с помощью Nginx. Nginx обслуживает статические HTML файлы, изображения (.jpg,.png,.gif), таблицы стилей (.css) и JavaScript (.js). Эти файлы не должны обрабатываться веб-сервером. Nginx выполнит эту работу.

server {
  listen          80;
  server_name     YOUR_DOMAIN;
  root            /PATH/TO/YOUR/WEB/APPLICATION;
  location / {
    index index.jsp;
  }
  location ~ \.jsp$ {
    proxy_pass              http://localhost:8080;
  }
  location ^~/servlets/* {
    proxy_pass              http://localhost:8080;
  }
}

Ответ 3

Чтобы обслуживать статический контент, вам даже не нужен сервлет. Статический контент можно поместить в папку, которая напрямую доступна через ваш сервер.

Например, если ваше имя приложения TestApp, вы можете разместить свое содержимое в каталоге TestApp/static/dir. Исходя из того, что ваша структура каталогов будет выглядеть следующим образом:

TestApp
   |
   |_____ WEB-INF
   |
   |_____ static
             |
             |____ dir

Выполняя вышеуказанную структуру каталогов, все ваше статическое содержимое, например. Sample.css будет доступно через URL-адрес ниже:

/TestApp/static/dir/Sample.css

Пожалуйста, посмотрите на этот вопрос для получения дополнительной информации Как обслуживать статический контент из tomcat

Обратите внимание, что при этом ваш статический каталог будет открыт для всех без каких-либо ограничений, что означает, что любой сможет получить доступ к вашему статическому контенту без какой-либо проверки подлинности. Но как его статический контент, я думаю, его штраф, если у вас нет причин для этого.

Ответ 4

Во-первых, файлы, расположенные в каталоге "WEB-INF", не доступны непосредственно в Интернете.

Кроме того, я заметил, что ваша запись "src/main/webapp/lib/META-INF/resources/" не включает извлеченный каталог WAR, а также папку веб-приложения.

Пример: src/main/webapp/[папка WAR]/lib/META-INF/resources/

Я предположил, что вы используете Tomcat. Итак, после того, как вы создадите свой файл WAR, перейдите в каталог "webapp", затем запустите Tomcat. Файл WAR должен извлекаться в папку веб-приложения с тем же именем, что и файл WAR. Теперь из браузера вы должны иметь доступ к любым файлам вне "WEB-INF".

пример: localhost:8080/[web app folder name]/[some file]

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

Ответ 5

Просто разместите статический контент в директории webapp. Эта часть может иметь прямой доступ. используя localhost: port/yourAppName/ Имя ресурса

Ответ 6

Основываясь на моем опыте (как уже было предложено Шринивасу Таллури), обратный прокси-сервер - это ответ на вашу проблему.

Вы можете использовать Nginx См. подробную конфигурацию или настроить Apache для работы в качестве обратного прокси.

Подробную конфигурацию для обслуживания статического содержимого через Nginx можно найти здесь

Когда статическое содержимое будет обрабатываться самим веб-сервером, ваша конфигурация сервлета может использоваться как есть. Таким образом, ваш сервлет будет обслуживать только динамические ресурсы.

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