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