#java #servlets #redirect #servlet-filters
#java #сервлеты #перенаправление #сервлет-фильтры
Вопрос:
Я хочу разрешить пользователям создавать группы в моем приложении и получать к ним доступ по URL. Например, если вы создали группу под названием «sweethatclub», вы могли бы получить к ней доступ по http://mysite.com/sweethatclub . Конечно, один и тот же код будет выполняться для /sweethatclub и / drillteam и даже / students / yearbook
Я работаю в среде Java servlet и не могу выровнять пути для этого. Я могу написать фильтр, который перехватывает все запросы и добавляет информацию к запросу путем синтаксического анализа URL, но тогда я хочу запустить код index.jsp. Я не хочу сопоставлять index.jsp со всеми URL-адресами, потому что, например, /images/smiley.jpg по-прежнему необходимо отвечать соответствующим файлом вместо index.jsp.
Есть ли способ отправлять все запросы сервлету, если только запросу не соответствует обычный старый файл? Или есть какой-то другой способ выполнить то, что я хочу здесь?
Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации. Я новичок в этой среде.
Ответ №1:
Шаблоны URL в web.xml предполагается, что они недостаточно умны, чтобы определить природу целевого URL. Если вы можете это терпеть, самым простым способом было бы поместить все указанные пользователем пути в хорошо известный root … где-нибудь отдельно от статических файлов. Таким образом, в конечном итоге вы получаете указанные пользователем пути, такие как http://mysite.com/sites/sweethatclub
.
В качестве альтернативы, вы можете переместить все свое статическое содержимое под http://mysite.com/static/
и настроить сопоставления сервлетов или фильтры для обработки всего, что начинается с 'static'
, отличного от динамического пространства URL.
Ответ №2:
Если вы работаете в среде Unix, вы могли бы просто создать все «сайты группы» в виде виртуальных каталогов, которые просто указывают на ваш каталог по умолчанию.
Комментарии:
1. Это хорошая идея, но, к сожалению, у меня нет доступа к файловой системе. Кроме того, я бы хотел избежать явной настройки перенаправлений, поскольку URL-адреса могут меняться в произвольное время.
2. Да, я не думал, что это будет лучший способ, это была просто мысль.
Ответ №3:
-
Сопоставьте сервлет с определенным шаблоном URL
<url-pattern>/groups/*</url-pattern>
-
Поместите все статическое содержимое в общую папку, например,
/static
и исправьте все URL-адреса на страницах, чтобы вместо этого указывать на этот URL. -
Создайте фильтр, который отображается на
<url-pattern>/*</url-pattern>
и выполняет следующую работу в
doFilter()
методеString uri = ((HttpServletRequest) request).getRequestURI(); if (uri.startsWith("/static/")) { chain.doFilter(request, response); // Goes to default servlet. } else { request.getRequestDispatcher("/groups" uri).forward(request, response); }
Нет, это не заканчивается
/groups
в адресной строке браузера URL. Это полностью прозрачно. При необходимости вы можете сделать «/static» и / или «/groups»<init-param>
частью фильтра, чтобы его можно было настроить извне.