2015-07-20 2 views
2

Я пытаюсь создать действие входа на мою веб-страницу, которое должно вызвать сервлет, передающий ему требуемые параметры, и вернуть объект JSON в браузер. Для этого я использую метод $ .getJSON() из jQuery.Нет ответа от метода jQuery getJSON

Вот HTML для моего входа form-

<form class="form" method="post" id="loginFrm" name="loginFrm"> 
    <div class="form-group"> 
     <label for="username">Email</label> 
      <input name="email" id="email" type="text" placeholder="Email" style="color: black;"> 
           </div> 
     <div class="form-group"> 
      <label for="password">Password</label> 
      <input name="password" id="password" type="password" placeholder="Password" style="color: black;"><br> 
     <span class="text-danger" id="error-box"></span> 
    </div> 
     <button id="btnLogin" class="btn btn-primary" style="margin-top: 17px;">Login</button> 
</form> 

Вот код JavaScript, который выполняется при нажатии кнопки на входе Button-

// Add an onlick handler to the login button 
$('#btnLogin').on('click', loginAction); 


function loginAction() { 
var userEmail = $('#email').val(); 
var userPassword = $('#password').val(); 

if (userEmail == "") { 
    $('#error-box').html("Please enter your email"); 
    $('#email').focus(); 
    return false; 
} 

if (userPassword == "") { 
    $('#error-box').html("Please enter your password"); 
    $('#password').focus(); 
    return false; 
} 

var credentials = $('#loginFrm').serialize(); 
// alert(credentials); 

var url = "/login?" + credentials; 

$.getJSON(url, function (data) { 
    alert("Inside getJSON callback method"); 
    alert(data); 
}); 
} 

Кроме того, здесь код из LoginServlet. сервлета отображается URL pattern-/войти в

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    logger.info("Inside LoginServlet"); 

    response.setContentType("application/json"); 

    String email = request.getParameter("email") == null ? "" : request.getParameter("email"); 
    String password = request.getParameter("password") == null ? "" : request.getParameter("password"); 

    logger.info("email:: " + email + " password::" + password); 

    Customer customer = null; 
    Developer developer = null; 

    JsonObjectBuilder objBuilder = Json.createObjectBuilder(); 
    JsonObject responseObject = null; 

    PrintWriter pout = response.getWriter(); 

    if (!email.equals("") && !password.equals("")) { 
     boolean loginSuccess = false; 
     logger.info("Trying to load customer entity"); 
     customer = ofy().load().key(Key.create(Customer.class, email)).now(); 

     if (null == customer) { 
      logger.info("customer entity not found. Trying to load developer entity"); 
      developer = ofy().load().key(Key.create(Developer.class, email)).now(); 

      if (developer != null) { 
       logger.info("developer entity found"); 
       if (developer.getPassword().equals(password)) { 
        logger.info("Developer login successful"); 
        loginSuccess = true; 

        responseObject = objBuilder.add("status", "success").add("userType", "developer").add("forwardUrl", "Home.jsp").build(); 

        logger.info("JsonObject constructed as:: " + responseObject); 
        pout.println(responseObject.toString()); 
        pout.flush(); 

        // request.getRequestDispatcher("Home.jsp").forward(request, response); 
       } 
      } 
     } else { 
      if (customer.getPassword().equals(password)) { 
       logger.info("Customer login successful"); 
       loginSuccess = true; 

       responseObject = objBuilder.add("status", "success").add("userType", "customer").add("forwardUrl", "Home.jsp").build(); 

       logger.info("JsonObject constructed as:: " + responseObject); 
       pout.println(responseObject.toString()); 
       pout.flush(); 

       // request.getRequestDispatcher("Home.jsp").forward(request, response); 
      } 
     } 

     if (!loginSuccess) { 
      // Login Failure 
      responseObject = objBuilder.add("status", "faliure").build(); 
      logger.info("Login Faliure. JsonObject constructed as:: " + responseObject); 

      pout.println(responseObject.toString()); 
      pout.flush(); 
     } 

    } 
} 

Моя проблема заключается в том, что, кажется, не сервлетов, возвращается ответ на getJSON(). Вкладка «Сеть» из Firefox не отображает ответа от запроса. Он даже не распечатывает код состояния HTTP запроса.

Однако, я знаю, что запрос достигает LoginServlet, как это видно из следующего ЖУРНАЛЫ РЕГИСТРАЦИИ-

[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doGet 
[INFO] INFO: Request inside doGet method. Calling doPost with it 
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost 
[INFO] INFO: Inside LoginServlet 
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost 
[INFO] INFO: email:: [email protected] password::prateek 
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost 
[INFO] INFO: Trying to load customer entity 
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost 
[INFO] INFO: customer entity not found. Trying to load developer entity 
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost 
[INFO] INFO: developer entity found 
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost 
[INFO] INFO: Developer login successful 
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost 
[INFO] INFO: JsonObject constructed as:: {"status":"success","userType":"developer","forwardUrl":"Home.jsp"} 

Но ответ от запроса AJAX пуст, и у меня возникли проблемы с пониманием, где мой код поступил не так.

Может ли кто-нибудь помочь мне в этом? Заранее спасибо.

EDIT Кроме того, когда я этот URL из Интернета PAGE- http://localhost:8080/[email protected]&password=prateek

Это дает мне правильный JSONObject Я expecting- { "статус": "Успех", "UserType": «разработчик», «forwardUrl»: «Home.jsp»}

+0

Любые ошибки в консоли? Вы видите запрос на вкладке «Сеть» вашего средства отладки? – dave

ответ

2

Многие проблемы здесь.

  1. Это очень плохая идея использовать GET для передачи учетных данных для входа. Обычно URL-адреса кэшируются в браузере, в журналах сервера и в других легко читаемых областях в виде обычного текста. Используйте POST для передачи учетных данных, убедитесь, что они прошли через SSL

  2. Никогда не войти учетные данные (вы можете делать только это для отладки, что естественно, но это очень плохая практика, чтобы попасть в)

  3. Ваш сервлет подключен для ответа doPost(), но вы используете AJAX GET для передачи данных. Основываясь на ваших журналах, похоже, что вы можете делегировать doPost с doGet, но это все еще не очень хорошая практика - просто используйте POST с самого начала.

  4. Вы используете элемент button, чтобы активировать действие входа в систему, но не указывая атрибут type или подавляя поведение по умолчанию.По умолчанию элемент button действует как кнопка submit, что означает, что пользователь, нажавший кнопку, сначала запускает поведение AJAX, а затем запускает поведение представления собственной формы (то есть отправляет данные, содержащиеся в #loginFrm, на загруженный в настоящее время URL-адрес через POST). Поскольку это по умолчанию перезагружает страницу, обратный вызов AJAX не срабатывает, как ожидалось.

Чтобы исправить, сделать 2 вещи:

1) Очистите вашу безопасность

A. Использование POST вместо GET. JQuery будет заботиться о разборе JSON для вас:

$.post("/login", credentials, function (data) { 
    alert("Inside getJSON callback method"); 
    alert(data); 
}); 

B. Удалить конфиденциальные данные из журналов. Также не забудьте удалить свои отчеты о регистрации на стороне сервера, которые выгружают конфиденциальные данные пользователя в журнал.

C. Не отвечайте на запросы GET из своего сервлета Login. Ваш сервлет-метод doGet() должен возвращать 404, а не регистрировать какие-либо конфиденциальные данные, а не пытаться предпринимать какие-либо действия над этими данными.

2) Не выводить действия по умолчанию

Вы хотите preventDefault() метод JQuery находится в вашем теле метода. Не забудьте также добавить обработчик отправки формы, чтобы предотвратить поведение отправки формы по умолчанию и делегировать ваш метод loginAction:

$('#btnLogin').on('click', loginAction); 
$('#loginFrm').on('submit', loginAction); 

function loginAction(eventObject) { 
    eventObject.preventDefault(); 
    var userEmail = $('#email').val(); 
    ... 
+0

@ Palpatim- Большое спасибо !!! Это сработало для меня очень хорошо ... И я обязательно буду помнить все ваши советы при написании кода в будущем. – plutonium1991

Смежные вопросы