如何在没有“路由”的情况下使用AngularJS刷新单页应用程序时对登录用户进行身份验证?

时间:2017-02-20 11:25:59

标签: java angularjs servlets single-page-application

我搜索了很多资源,但没有一个适合我的问题。我正在处理single page application (SPA)项目,每当他刷新页面时我都需要logged in userstay logged in 没有 路由

我试图在页面的主session authentication servlet中调用controller(此servlet会检查会话是否存在),但它不起作用。

注意:会话是在用户log insing up后创建的。 这是SessionAuthServlet.java

HttpSession session = request.getSession(true);
User u=(User) session.getAttribute("usersession");
try{
    response.setContentType("application/json; charset=UTF-8");
    PrintWriter out = response.getWriter();
    if(u != null)
    {
        out.println("{\"+success+\"}");
        out.close();
    }
    else
    {
        out.println("{ \"result\": \"fail\"}"); 
        out.close();
    }
    }catch (IOException e) {  
        e.printStackTrace();  
}
HTML单页面应用程序中的

MainController

appvar.controller('MianController',['$scope','$http','$rootScope',function($scope, $http,$rootScope) {                      
    $rootScope.sessionvalid=function(){
        $http.get("http://localhost:8080/MyProject/SessionAuthServlet")
        .success(function(response) {
            if (response.result=="fail")
                {
                  //***Show the view for not logged user      
                }
                  //***Show the view for logged user
                }

                $rootScope.sessionvalid();
       });
    }
}]);

任何想法如何处理这个?

请指导我

由于

1 个答案:

答案 0 :(得分:0)

以下是在不使用路由的情况下在页面刷新后保持记录的方法。 您将需要以下三件事

  1. 用于保存用户信息的角度服务,以及是否经过身份验证。
  2. 用于保存用户信息的窗口会话存储。即使页面被重新引用,用户信息也会在sessionstorage中保留
  3. 设置请求和响应的拦截器。
  4. 服务代码 -

        app.service('AuthenticationService', function() {
            var auth = {
                isLogged: false,
                email:"",
                isAdmin:false
            } 
            return auth;
        });
    

    在您的MainController中,一旦用户登录,设置Service AuthenticationService.isLogged = true和$ window.sessionStorage = userInfo

    拦截器代码 -

        app.service('TokenInterceptor', function ($q, $window, $location, AuthenticationService) {
    return {
        request: function (config) {
            config.headers = config.headers || {};
            if ($window.sessionStorage.token) {
                config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
            }
            return config;
        }, 
    
        /* Set Authentication.isAuthenticated to true if 200 received */
        response: function (response) {
            if (response != null && response.status == 200 && $window.sessionStorage.token && !AuthenticationService.isAuthenticated) {
                AuthenticationService.isAuthenticated = true;
            }
            return response || $q.when(response);
        }
    };
    });
    

    并在你的app.config块中添加 -

    app.config(function($httpProvider){
      $httpProvider.interceptors.push(TokenInterceptor);
    })
    

    现在,即使页面被引用,您的AuthenticationService.isLogged也将保持为真,您可以在服务中获取登录的用户信息。