Почему я получаю сообщение об ошибке: метод HTTP GET не поддерживается этим URL-адресом, хотя я нигде не использую его в своем коде

Я разрабатываю приложение сервлета входа в систему, мой код выглядит следующим образом:

Страница входа для отображения двух текстовых полей и одной кнопки входа. Где пользователь вводит имя пользователя и пароль и отправляет данные.

public class LoginPage extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
         String contextPath = request.getContextPath();
            out.println("<form method='post' action='LoginCheck'>");
            out.println("Username: <input type='text' name='username'>");
            out.println("<br>");
            out.println("Password: <input type='password' name='password'>");
            out.println("<br>");
            out.println("<input type='submit' value='login'>");
            out.println("<br>");
        out.println("</form>");
    }
}

Страница проверки входа Эта страница предназначена для проверки имени пользователя и пароля пользователя. После проверки правильности имени пользователя и пароля выполняется перенаправление на страницу приветствия, а если неверно, то выполняется перенаправление на < strong>Страница ошибок И код для каждой страницы выглядит следующим образом:

public class LoginCheck extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if(username.equals("abs") && password.equals("abs")){
            response.sendRedirect("Welcome");
        }else{
            response.sendRedirect("Error");
        }
    }
}

Добро пожаловать Если имя пользователя и пароль верны.

public class Welcome extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("<h3>Welcome user</h3>");
    }
}

Ошибка, если имя пользователя или пароль неверны.

public class ErrorPage extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("<h3>ERROR !!!</h3>");
        out.println("<h3>Username or Password you entered is wrong.</h3>");
    }
}

ХОРОШО !!! Но после ввода имени пользователя и пароля на страницу входа он переходит к checklogin, а когда переходит на страницу приветствия или страницу ошибки, выдает ошибку !!!

Статус HTTP 405 — HTTP-метод GET не поддерживается этим URL-адресом

Я не использую метод GET нигде в приведенном выше коде, как вы можете видеть, но почему я получаю этот тип ошибки???


person Abhijit Kumbhar    schedule 02.09.2015    source источник
comment
Вы отправляете редирект — это сообщает браузеру, что страница перемещена (HTTP 302). Затем браузер использует GET для получения новой страницы. Но ни ваши Error, ни ваши Welcome страницы поддерживают GET.   -  person Boris the Spider    schedule 02.09.2015
comment
Итак, что я могу сделать сейчас, чтобы решить эту проблему?   -  person Abhijit Kumbhar    schedule 02.09.2015
comment
Поддерживайте GET в своих сервлетах. Или не используйте перенаправление.   -  person Boris the Spider    schedule 02.09.2015
comment
Так есть ли у них какой-либо вариант вместо перенаправления?   -  person Abhijit Kumbhar    schedule 02.09.2015
comment
Пожалуйста, прочитайте ссылки, которые люди дают вам, прежде чем беспокоить их.   -  person Boris the Spider    schedule 02.09.2015
comment
Если вы должны использовать POST, см. этот вопрос, но вы не отправляете никаких данных в сервлет, поэтому вам действительно не следует использовать POST   -  person Andrew Mairose    schedule 02.09.2015


Ответы (2)


Причина, по которой вы получаете HTTP 405, заключается в том, что HttpServletResponse.sendRedirect указывается следующим образом:

Отправляет временный ответ перенаправления клиенту, используя указанный URL-адрес расположения перенаправления.

Поэтому, если вы делаете response.sendRedirect("Welcome");, вы «говорите» клиентскому браузеру вместо этого перейти к относительному URL-адресу «Добро пожаловать». Это по совпадению сопоставлено с вашим Welcome-сервлетом (я полагаю). HTTP поддерживает только перенаправления GET, поэтому клиентский браузер выдает запрос GET, но ваш Welcome-сервлет поддерживает только POST.

Если вы измените свой Welcome-servlert таким образом, он должен работать:

public class Welcome extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("<h3>Welcome user</h3>");
    }
}

Не забудьте также изменить свой ErrorPage-сервлет.

НО обратите внимание на следующее!

Вы не должны использовать перенаправление на стороне клиента, а перенаправление на стороне сервера, например:

public class LoginCheck extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if(username.equals("abs") && password.equals("abs")){
            RequestDispatcher rd = request.getRequestDispatcher("Welcome");
            rd.forward(request, response);
        }else{
            RequestDispatcher rd = request.getRequestDispatcher("Error");
            rd.forward(request, response);            
        }
    }
}
person Lars Gendner    schedule 02.09.2015
comment
После использования `RequestDispatcher rd = request.getRequestDispatcher(Welcome); rd.forward(запрос, ответ);` Это работает. :) а не могли бы вы объяснить, почему здесь так происходит??? - person Abhijit Kumbhar; 02.09.2015
comment
@AbhijitKumbhar, ты прочитал ссылку, которую я тебе дал, или ты все еще демонстративно ее игнорируешь? Пожалуйста, перестаньте просить, чтобы вас кормили с ложки, и почитайте. Вы никогда не станете опытным программистом, если не умеете читать простую документацию. - person Boris the Spider; 02.09.2015
comment
Извините @BoristheSpider Я не узнал вашу ссылку, но теперь я прочитал это и понял Спасибо. - person Abhijit Kumbhar; 02.09.2015

Изменять

protected void doPost(HttpServletRequest request, HttpServletResponse response)

to

protected void doGet(HttpServletRequest request, HttpServletResponse response)

в вас методы приветствия и ошибки. Спасибо Andrew Mairose за указание на это в комментариях.

Ссылка — http://www.wellho.net/resources/ex.php4?item=j601/demolet.java

person Harish Ved    schedule 02.09.2015
comment
Вы не имеете в виду наоборот? - person Andrew Mairose; 02.09.2015
comment
@AbhijitKumbhar смотрите мой комментарий. Вы используете GET, конечно. - person Boris the Spider; 02.09.2015
comment
Но что, если я хочу использовать post - person Abhijit Kumbhar; 02.09.2015
comment
http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletResponse.html#sendRedirect(java.lang.String) sendRedirect — это перенаправление URL-адреса, что означает метод GET для URL-адреса. - person Harish Ved; 02.09.2015
comment
Почему вы хотите использовать POST? Вы не должны использовать POST, если вы не отправляете какие-либо данные в сервлет. - person Andrew Mairose; 02.09.2015