RequestDispatcher.forward () не пересылается при вызове сервлета через Ajax POST - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть страница входа, где я аутентифицирую пользователя с помощью firebase и отправляю запрос сервлету.Когда я нажимаю кнопку submit с правильной аутентификацией, аутентификация firebase работает, сервлет вызывается, но в браузере я вижу ошибку.

Прежде всего, это мой код JavaScript

function toggleSignIn() {
    if (firebase.auth().currentUser) {
        alert('existing user');
        firebase.auth().signOut();
    } else {
        var email = document.getElementById('email').value;
        var password = document.getElementById('password').value;

        if (email.length < 4) {
            alert('Please enter an email address.');
            return;
        }

        if (password.length < 4) {
            alert('Please enter a password.');
            return;
        }

        firebase.auth().signInWithEmailAndPassword(email, password).then(function (firebaseUser) {
            var email = firebase.auth().currentUser.email;
            const options = {
                method: 'POST',
                url: 'LoginValidator',
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded"
                },
                body: `email=${email}`
            }
            url = 'LoginValidator'
            fetch(url, options)
                .then(response = > response.json())
                .then(data = > console.log(data))
                .catch(e = > console.error(e))
        }).catch(function (error) {
            var errorCode = error.code;
            var errorMessage = error.message;
            if (errorCode === 'auth/wrong-password') {
                alert('Wrong password.');
            } else {
                alert(errorMessage);
            }
            console.log(error);
            document.getElementById('quickstart-sign-in').disabled = false;
        });
    }
    document.getElementById('quickstart-sign-in').disabled = true;
}

HTML

<div id="login-box" class="col-md-12">

    <div class="form-group">
        <input type="text" name="email" id="email" class="form-control login-input" placeholder="username">
    </div>
    <div class="form-group">
        <input class="form-control login-input" type="password" placeholder="Password" id="password" name="password">
        <i id="open" class="fa fa-eye fa-2x"></i>
        <i id="closed" class="fa fa-eye-slash fa-2x"></i>
    </div>
    <div class="form-group">
        <input type="submit" id="quickstart-sign-in" name="quickstart-sign-in"
               class="form-control btn btn-info btn-md login-bt" value="Login" onclick="toggleSignIn()">
    </div>
    <div class="form-group text-center forgot">
        <a href="#">Forgot username</a> / <a href="#">password?</a>
    </div>

</div>

Ниже мой сервлет

LoginValidator.java

public class LoginValidator extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String email = request.getParameter("email");
        System.out.println("Printing email: "+email);

        try {

            System.out.println("inside try");

            User user = new User();
            UserRight userRight = new UserRight();

            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.registerTypeAdapter(Date.class, new DateTypeDeserializer());
            Gson gson = gsonBuilder.create();

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BaseURLs.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();

            //Get user
            RestEndPointsInterface endPoint = retrofit.create(RestEndPointsInterface.class);
            Call<User> call = endPoint.getUserByEmail(email);
            user = call.execute().body();

            System.out.println(user.getName());

            //Get user rights
            Call<UserRight> userRightCall = endPoint.getUserRightByID(user.getUserRights().getIduserRight());
            userRight = userRightCall.execute().body();

            System.out.println(userRight.getUserRight());

            if(userRight.getUserRight().equals("admin"))
            {
                response.getWriter().write("{url:LoadSellPendingApprovals}");
            }
            else
            {
                response.getWriter().write("{url:index.html}");
            }


        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

LoginValidator вызывает LoadSellPendingApprovals, ниже его код

public class LoadSellPendingApprovals extends HttpServlet {


    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        List<ProductSellAdvertisement> categoryList = new ArrayList<ProductSellAdvertisement>();

        try {

            System.out.println("INSIDE LoadSellPendingApprovals");

            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.registerTypeAdapter(Date.class, new DateTypeDeserializer());
            Gson gson = gsonBuilder.create();

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BaseURLs.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();

            RestEndPointsInterface endPoint = retrofit.create(RestEndPointsInterface.class);
            Call<List<ProductSellAdvertisement>> call = endPoint.getAllPendingApprovals();
            categoryList = call.execute().body();

            for (int i = 0; i < categoryList.size(); i++) {
                System.out.println(categoryList.get(i).getProduct().getProductName());
            }

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally {
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/jsp/product-sell-pending-approvals.jsp");
            request.setAttribute("approvalList", categoryList);
            requestDispatcher.forward(request, response);
        }
    }


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }


    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

Это ошибка, которую я получаю

SyntaxError: Unexpected token < in JSON at position 0
    at (index):71

enter image description here

в моем коде javascript указано следующее: .then(response => response.json())

Ожидаемое поведение:

  1. Учетные данные для ввода пользователя
  2. Аутентификация учетных данных с помощью firebase javascript api
  3. Если учетные данные верны, отправьте их сервлету LoginValidator, где он будет дополнительно проверять подлинность пользователя.
  4. Затем LoginValidator отправит запрос на LoadSellPendingApprovals, где онвыполнит следующий код

    RequestDispatcher requestDispatcher = request.getRequestDispatcher ( "/ WEB-INF / JSP / продукт-продажи находящейся на рассмотрении-approvals.jsp");request.setAttribute ("compatibilityList", categoryList);requestDispatcher.forward (request, response);

В дополнение к получаемой ошибке, я также никогда не перенаправляюсь на страницу JSP.Как я могу решить эту проблему?

Я работаю в java и на мобильных устройствах, не очень разбираясь в технологии Javascript.Поэтому оцените подробные четкие ответы.

1 Ответ

0 голосов
/ 16 апреля 2019

Ваша ошибка означает, что результат "body" содержит не JSON, а HTML:

Неожиданный токен <в JSON в позиции 0 </p>

JSON будет выглядеть так:

{ key: value }

HTML выглядит так:

<html>....</html>

Как говорится в сообщении об ошибке, первый < (позиция 0) является «неожиданным токеном». Все, что читает тело, ожидало {.

Одной из причин этого может быть то, что отправляемый вами запрос перенаправляется на страницу входа в систему, и поэтому вы получаете HTML вместо ожидаемого JSON. Или вы получаете страницу с ошибкой, которую вы пытаетесь передать своему анализатору JSON.

К сожалению, с этой небольшой информацией трудно сказать. Вы должны отладить свой код и проверить полученный ответ.

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