Как обработать запрос на странице, ранее переадресованной сервлетом? - PullRequest
2 голосов
/ 08 сентября 2010

У меня есть страница JSP с 2 формами, работающими на Tomcat 6. Одна - это форма регистрации, вторая - форма входа. (пожалуйста, обратите внимание на контекстный путь, он убьет меня позже)

(regis_and_login.jsp)

    <% String path = request.getContextPath(); %>

    //regis form
    <form id="regis_form" name="register_form" 
action="<%= path %>/servlet/process_register" method="post">

     //login form
    <form name="login_form" action="<%= path %>/servlet/login" method="POST">

ЗАДАЧА

Если инструкция вставки для добавления нового пользователя не удалась, я хочу перенаправить пользователя обратно на страницу regis_and_login.jsp с отображаемой пользовательской ошибкой.

поведение сервлета

(сервлет входа)

В случае сбоя входа в систему к запросу добавляется мое пользовательское сообщение об ошибке (т. Е. request.setAttribute("error", "there is error!"), и диспетчер переадресует обратно на страницу regis_and_login.jsp и правильно отображает сообщение об ошибке, но так как это forward , URL изменения ОТ http://localhost:8080/regis_and_login.jsp ДО http://localhost:8080/servlet/login

(RegisterServlet) Регистрация сервлетов работает так же. Если обнаружена какая-либо ошибка, я вызываю setAttribute () по запросу и вызываю функцию forward RequestDispatcher, чтобы перенаправить пользователя обратно на страницу regis_and_login.jsp с отображаемой пользовательской ошибкой.

ПРОБЛЕМА

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

  1. Заполните неверные данные для входа в форму, чтобы вы перенаправились обратно к http://localhost:8080/servlet/login с моим должным образом отображаемым моим сообщением.

  2. На той же странице (http://localhost:8080/servlet/login), заполните регистрационную форму и отправьте.

Результат:

Теперь URL выглядит сумасшедшим.

The requested resource (/servlet/servlet/process_register) is not available.

Я думаю, это потому, что в regis_and_login.jsp я устанавливаю contextPath и объединяю в значение действия формы: action="<%= path %>/servlet/process_register

Поэтому я считаю, что после изменения URL-адреса путем переадресации (http://localhost:8080/servlet/login), contextPath теперь установлен в "/ servlet /", и поэтому я запрашиваю /servlet/servlet/process_register вместо просто /servlet/process_register?

В моем уме есть несколько вариантов:

  1. Просто используйте абсолютный путь для пути действия формы

  2. Вместо пересылки используйте response.sendRedirect (address), чтобы избежать изменения URL-адреса (но это не позволяет мне устанавливать атрибут по запросу, поэтому я не могу отобразить сообщение об ошибке на своей странице JSP ... это против моя цель)

Должен ли я просто использовать абсолютный путь?

Пожалуйста, дайте мне знать, если вам нужно больше разъяснений ..

UPDATE

Я попросил службу поддержки удалить директивы монтирования, и теперь она принимает все входящие запросы. В web.xml и URL-адресе действия формы больше не упоминается «/ servlet», и код начал работать просто отлично. Теперь я думаю, что причина в наличии дополнительного "/ servlet", мне интересно, связано ли это с директивой mount ..

1 Ответ

1 голос
/ 08 сентября 2010

но так как это переадресация, URL меняется с http://localhost:8080/regis_and_login.jsp на http://localhost:8080/servlet/login

Эта фраза немного странная. Форвард не меняет URL вообще. Переадресация просто указывает на другой ресурс (сервлет или JSP), чтобы продолжить обработку HTTP-запроса current . Изменение URL-адреса вызвано тем, что URL-адрес действия формы отличается от исходного URL-адреса запроса. Вы запускаете синхронный запрос POST по этому URL. URL в адресной строке браузера становится URL действия формы.

Теперь URL выглядит сумасшедшим.
Запрашиваемый ресурс (/ servlet / servlet / process_register) недоступен.

Итак, в начале у вас есть контекстный путь "/" и после отправки формы он становится "/servlet"? Извините, проблема вызвана чем-то другим. Ваше веб-приложение развернуто как ROOT? Вы запускаете код, который, как вы думаете, вы запускаете?


Однако у меня есть две рекомендации, как по-другому подойти к этому вопросу:

  1. Не отображайте сервлеты на /servlet/process_register и /servlet/login, а только на /process_register и /login.

    <form action="process_register" method="post">
    ...
    <form action="login" method="post">
    
  2. Или, спрячьте файл JSP в папке /WEB-INF, используйте один сервлет на /register_and_login для GET и POST и позвольте сервлету выполнить желаемое действие в зависимости от нажатой кнопки. Таким образом, URL остается http://localhost:8080/register_and_login все время.

...