2016-03-07 70 views
0

我想獲得一個簡單的angularjs登錄屏幕工作。 角度應用程序通過http get方法將登錄詳細信息發送到java servlet,並預期成功/失敗的json響應。 Java servlet在Tomcat 8.0上運行。

不幸的是,角應用似乎不能夠從servlet接收數據(它發送該數據到servlet) - 「則」被稱爲每次的errorCallback方法。

此外,直接從瀏覽器訪問servlet的url可以正常工作(瀏覽器顯示響應字符串)。

你能幫我找到問題嗎?

這是在HTML頁面的div元素:

 <div ng-controller = "loginCtrl"> 
    <input type="text" ng-model = "userName" placeholder="Username"></input><br> 
    <input type = "text" ng-model = "userPass" placeholder="Password"></input><br> 
    <button type = "button" ng-click = "login()">Login</button><br> 

    {{message}} 
</div> 

這是js代碼:

var expenseApp = angular.module("expenseApp",[]); 

expenseApp.controller('loginCtrl',['$scope','$http',function($scope,$http) { 
    $scope.userName = ""; 
    $scope.userPass = ""; 
    $scope.message = "type in your credentials"; 
    $scope.login = function() { 
     var address = "http://localhost:8080/ExpenseSystemServer/LoginServlet?userName=" + $scope.userName + "&userPass=" + $scope.userPass; 
     $http({method:'get', 
     url:address}) 
     .then(function(data, status, headers, config) { 
       $scope.message = "http success"; 
       }, 
       function(data, status, headers, config) { 
        $scope.message = "http error"; 
       }); 
    }; 
}]); 

而且這是在Java servlet的doGet方法(servlet的類名是LoginServlet ):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("application/json"); 
     response.setCharacterEncoding("UTF-8"); 

     String userName = request.getParameter("userName"); 
     String userPass = request.getParameter("userPass"); 
     System.out.print("Login attempt with " + userName + "; " + userPass + ": "); 
     if (userName == null || userPass == null || !userName.equals("admin") || !userPass.equals("pass")){ 
      response.getWriter().write("{'success':false,'message':'wrong details'}"); 
      System.out.println("failed."); 
     } 
     else { 
      response.getWriter().write("{'success':true, 'user':{'name':'admin'},'message':'Hi admin!'}"); 
      System.out.println("succeeded."); 
     } 

    } 

你能幫我嗎?

謝謝。

回答

1

您從servlet發送無效的JSON。 JSON鍵和字符串值必須使用雙引號,而不是單引號。使用JSONLint來驗證您的JSON。或者,更好的辦法是創建一個Java對象,然後像Jackson一樣編碼器將該對象轉換爲有效的JSON。

而不是發送一個成功的響應(與代碼200),與對象屬性「成功」設置爲false,您應該返回錯誤響應(400如果所需的憑據根本不存在,401 if他們無效)。這樣做,不僅顯示了HTTP協議的尊重,但使用HTTP承諾允許像預期一樣:的

http(...).then(successCallback, errorCallback) 

代替

http(...).then(successButActuallyMaybeErrorCallback, anotherErrorCallback) 
0

你JSON是無效的使用單引號,應該是雙

當大多數語言可以從本​​地數組和對象爲您編碼時,創建自己的程序是一種非常糟糕的做法。我不知道最好的方法使用Java,但它需要看起來像:

response.getWriter().write('{"success":false,"message":"wrong details"}'); 

注單開關和雙引號