Мы разрабатываем веб-приложение, мы используем 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, может быть, проблема возникает из угловой части?
Любая помощь будет принята с благодарностью,
Заранее спасибо
Вы не используете Spring Security, вы фактически работаете вокруг него ... –
Спасибо за отзыв, и вы считаете, что это часть проблемы? Мы все равно должны использовать 'HttpSession', верно? – Ostro23
Если вы используете Spring Security и используете по умолчанию, '/ login' перехватывается Spring Security, и ваш контроллер ничего не делает. Не должно быть ничего, что помешает вам использовать «HttpSession» (мы используем аналогичную настройку в моем текущем проекте). –