Выполнять все запросы для mysite.com/user/specified/path запускать один и тот же JSP

#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:

  1. Сопоставьте сервлет с определенным шаблоном URL

     <url-pattern>/groups/*</url-pattern>
      
  2. Поместите все статическое содержимое в общую папку, например, /static и исправьте все URL-адреса на страницах, чтобы вместо этого указывать на этот URL.

  3. Создайте фильтр, который отображается на

     <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> частью фильтра, чтобы его можно было настроить извне.