Как мне указать строку запроса в Tomcat?? - PullRequest
3 голосов
/ 27 марта 2012

Я использую Tomcat 5.5.4, и у меня работает сервлет без проблем. Однако я хотел бы настроить сопоставление для запуска сервлета только при отправке URL-адреса, содержащего определенную строку запроса.

Прямо сейчас в web.xml у меня есть: <servlet-mapping> <servlet-name>MyServer</servlet-name> <url-pattern>/go/*</url-pattern> </servlet-mapping>

Если браузер отправляет http://localhost/MyServer/go?P=123, сервлет запускается и все хорошо. Тем не менее, я хотел бы запустить этот сервлет, только если URL-адрес точно такой, как показано. К сожалению, прямо сейчас, если URL-адрес http://localhost/MyServer/go?P=AnyDarnThing, сервлет все еще запускается. Я попытался настроить следующее: <url-pattern>/go?P=123</url-pattern> но это приводит к тому, что запрошенный ресурс (/ MyServer / go) недоступен.

Я пробовал многочисленные варианты (цитируя строку, ...) в приведенном выше шаблоне URL, но я всегда получаю вышеуказанную ошибку. Я замечаю, что если я (в целях отладки) опускаю "?" как в <url-pattern>/goP=123</url-pattern> Я больше не получаю сообщение об ошибке, и сервер запускается (но, конечно, он не отвечает на «строку запроса», потому что она не сформирована должным образом.) Это наводит на мысль, что «?» вызывает проблему в отображении. Я попытался заменить его эквивалентным символом URL следующим образом: <url-pattern>/go%3FP=123</url-pattern> но это дает тот же результат, только что описанный выше, когда я пытался сбросить «?» в целом.

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Вы не можете этого сделать.url-pattern довольно ограничен.

Если вы хотите, чтобы отдельные действия выполнялись на основе параметра GET, вы можете сделать это вручную.В doGet() методе сервлета есть простое if -клавишное значение, и вызываются разные методы в зависимости от строки запроса / параметра get.

2 голосов
/ 27 марта 2012

Вы не можете сделать это, используя шаблоны URL.

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

Вот как будет выглядеть фильтр:

public class ServletAcessFilter implements Filter
{
  public void init(FilterConfig filterConfig) throws ServletException
  {

  }

  public void doFilter(ServletRequest request, ServletResponse response,
  FilterChain filterChain) throws IOException, ServletException
  {
    //validate the request, check if the request can be forwarded to servlet.
    if(request.getParameter("P").equalsIgnoreCase("123")){
        filterChain.doFilter(request, response);
    } else {
        //write what you want to do if the request has no access
        //below code will write 404 not found, you can do based on your requirement
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setStatus(404);
    }
  }

  public void destroy()
  {

  }
}

Определите фильтр в web.xml следующим образом:

<filter>
    <filter-name>ServletAccessFilter</filter-name>
    <filter-class>com.ServletAcessFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ServletAccessFilter</filter-name>
    <url-pattern>/go/*</url-pattern>
</filter-mapping>
1 голос
/ 27 марта 2012

Чтобы добавить ответ Божо, вы также можете попробовать перейти на Чистые URL

Это значительно расширит ваши возможности с точки зрения соответствия шаблону URL и, в частности, может значительно упростить настройку внешнего обратного прокси-сервера, если он вам понадобится.

...