2016-06-01 4 views
1

Мы разрабатываем веб-приложение, мы используем Spring MVC (вместе с Spring Boot и) и AngularJS. Поэтому у нас есть два разных сервера для приложения.AngularJS/Spring MVC, HttpSession не является постоянным

Мы пытаемся сохранить пользовательский сеанс, чтобы обеспечить надлежащий уровень безопасности, поэтому мы попытались использовать объект HttpSession, но каждый раз, когда мы хотим получить существующий сеанс, создается новый экземпляр (мы, проверили идентификаторы сеанса).

Вот что мы делаем для входа:

$scope.authenticate = function() { 

    var postObject = new Object(); 
    postObject.mail = $scope.userName; 
    postObject.password = $scope.userPassword; 

    $http({ 
    url: "http://localhost:8080/login", 
    method: "POST", 
    dataType: "json", 
    data: postObject, 
    headers: { 
     "Content-Type": "application/json" 
    } 
    }).success(function successCallback(response, status) { 
     if (status == 200) { 
     $scope.messageAuth = "Login successful" 
     $scope.go('/services'); 
     } 
    }) 
    .error(function errorCallback(error, status) { 
     $scope.messageAuth = "Error " + response; 
    }); 
}; 

Затем мы проверяем учетные данные, если они правильны, мы храним информацию о пользователе в новой сессии:

@RestController 
public class UserController { 

@Resource 
UserService userService; 

@CrossOrigin 
@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json") 
public ResponseEntity<User> loginSubmit(@RequestBody User user, HttpServletRequest request, HttpSession session) { 
    if (isAuthorized(user)) { 
     User authenticatedUser = this.userService.getUserByMail(user.getMail()); 
     authenticatedUser.setPassword(null); 

     session.invalidate(); 
     HttpSession newSession = request.getSession(true); 
     newSession.setAttribute("USER_ROLE", authenticatedUser.getRole()); 

     System.out.println("/login : SESSION ID = " + newSession.getId()); 
     System.out.println("/login : " + newSession.getAttribute("USER_ROLE")); 

     return ResponseEntity.ok(authenticatedUser); 
    } else { 
     return ResponseEntity.status(HttpStatus.UNAUTHORIZED) 
       .body(null); 
    } 
} 

@RequestMapping("/user") 
public String user(Principal user, HttpServletRequest request, HttpSession session) { 
    System.out.println("/user : SESSION ID = " + session.getId()); 
    System.out.println("/user : " + (String) request.getSession(false).getAttribute("USER_ROLE")); 
    return (String) session.getAttribute("USER_ROLE"); 
} 

И наконец, из приложения «Угловое» мы хотели бы получить информацию о пользователе, позвонив по телефону /user следующим образом:

var f = function() { 
    $http.get('http://localhost:8080/user').success(function successCallback(response) { 
     console.log(response); 
    }).error(function() { 
     console.log('error'); 
    }) 
}; 

Мы уже пробовали почти все, что мы узнали о том, как управлять сеансом с помощью Spring Security, может быть, проблема возникает из угловой части?

Любая помощь будет принята с благодарностью,

Заранее спасибо

+0

Вы не используете Spring Security, вы фактически работаете вокруг него ... –

+0

Спасибо за отзыв, и вы считаете, что это часть проблемы? Мы все равно должны использовать 'HttpSession', верно? – Ostro23

+0

Если вы используете Spring Security и используете по умолчанию, '/ login' перехватывается Spring Security, и ваш контроллер ничего не делает. Не должно быть ничего, что помешает вам использовать «HttpSession» (мы используем аналогичную настройку в моем текущем проекте). –

ответ

1

Мы нашли решение, мы просто нужно добавить несколько строк конфигурации в нашем app.js файле:

$httpProvider.defaults.useXDomain = true; 
$httpProvider.defaults.withCredentials = true; 

Более подробная информация здесь: link

Надеюсь, это поможет кому-нибудь, когда-нибудь!

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