HTTP-метод POST не поддерживается этим URL-адресом Java сервлет - PullRequest
0 голосов
/ 30 мая 2020

Кто-нибудь может сказать мне, почему я получаю сообщение об ошибке: HTTP Status 405 - Method Not Allowed? Я пытаюсь выполнить sh, что после метода doPost () пользователь будет перенаправлен на контроллер «/ logout», где недействителен сеанс. Это забавно, потому что метод вызывается, делайте все, что должно делать (обновлять пользователя в базе данных), но после отправки пользователю ошибки 405. Еще я использую doPost () (например: LoginController) работает хорошо, но когда я пытаюсь найти ошибка, я ничего не вижу: <</p>

<div class="container">
    <div class="col-md-8 col-md-offset-2">
        <form method="post" action="account">
            <div class="form-group">
                <label for="email">Email address</label>
                <input name="email" type="email" class="form-control" id="email"
                       value="${sessionScope.loggedUser.email}" required aria-describedby="emailHelp"
                       placeholder="Enter email">
            </div>
            <div class="form-group">
                <label for="password">Password</label>
                <input name="password" type="password" minlength="5" maxlength="40" required class="form-control"
                       id="password" placeholder="Password">
            </div>
            <div class="form-group">
                <label for="repeatPassword">Repeat Password</label>
                <input name="repeatPassword" type="password" minlength="5" maxlength="40" required class="form-control"
                       id="repeatPassword" placeholder="Password">
            </div>
            <input class="btn btn-lg btn-primary btn-block" type="submit" value="Save changes"/>
        </form>
    </div>
</div>

@WebServlet("/account")
public class AccountController extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String email = req.getParameter("email");
        String password = req.getParameter("password");
        String repeatPassword = req.getParameter("repeatPassword");

        if (email == null || password == null || repeatPassword == null) {
            doGet(req, resp);
            return;
        }

        if (password.equals(repeatPassword)) {
            HttpSession session = req.getSession();
            User user = (User) session.getAttribute("loggedUser");
            user.setEmail(email);
            String sha1hexPassword = DigestUtils.sha1Hex(password);
            user.setPassword(sha1hexPassword);
            UserService service = new UserService();

            try {
                service.update(user);
            } catch (UpdateObjectException e) {
                e.printStackTrace();
            }
            req.getRequestDispatcher("/logout").forward(req, resp);
        } else {
            req.setAttribute("errorMessage", "Passwords not the same");
            req.setAttribute("fragment", "account");
            req.getRequestDispatcher("WEB-INF/index.jsp").forward(req, resp);
        }
    }
}

Спасибо за подсказку.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Проблема решена. Здесь:

req.getRequestDispatcher("/logout").forward(req, resp);

я должен сделать

resp.sendRedirect(req.getContextPath()+"/logout");

, потому что в "/ logout" у меня есть только метод doGet (), и если я использую "getRequestDispatcher ()", попробуйте найти doPost () метод.

0 голосов
/ 30 мая 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...