2016-08-11 4 views
1

У меня есть приложение angular2 и используйте Tomcat с пружиной для получения данных. Я не хочу перезагружать или перенаправлять страницы, мне нужны только данные, поэтому все ответы с сервера содержат аннотации @ResponseBody.Spring @ResponseBody не может использовать сеанс

Моя проблема заключается в том, что из-за этой аннотации я не могу получить переменную сеанса пользователя. Когда я вхожу в систему, я создаю сеанс, храня в нем пользовательские данные, но не могу получить его при следующем вызове.

@JsonIgnoreProperties(ignoreUnknown = true) 
@RequestMapping(method = RequestMethod.POST) 
@ResponseBody 
public String login(HttpServletRequest REQ, @RequestBody String BODY) throws Exception 
{ 
      ...check if all ok... 
       REQ.getSession().setAttribute("user", user); 
      ... return user data... 
} 

Есть ли другой способ, которым я могу отправить свои данные обратно клиенту вместе с необходимы данные, чтобы иметь возможность использовать сеанс.

Редактировать: Проблема не на стороне сервера, а на клиенте. Угловое не отправляет cookie JSESSIONID по кросс-доменным запросам по умолчанию.

+0

Что означает «не может получить переменную сеанса пользователя»? Разве это не компилируется? Это крушение? Возвращает ли он недопустимые или пустые данные? Какое сообщение об ошибке, если таковое имеется? – Codo

+0

Это не имеет никакого отношения к угловому2, поэтому вы можете удалить этот тег. –

+0

@ Koos Gadellaa Я просто хотел написать - это не имеет ничего общего с весной и, возможно, даже с Java :) В зависимости от точки зрения, я думаю. –

ответ

1

Сначала проверьте свой запрос/ответ (например, в инструментах Chrome dev). Tomcat создает новый файл cookie с именем JSESSIONID, чтобы связать клиента с объектом сеанса сервера, поэтому найдите его в заголовке ответа метода входа в систему. Затем убедитесь, что вы отправляете этот файл cookie на свой сервер в следующем запросе. Создание сеанса не имеет ничего общего с Spring или @ResponseBody, его время жизни управляется контейнером (Tomcat).

Также, если вы делаете запросы на перекрестный домен, отметьте this answer.

+0

Спасибо за ответ. Я перепутал и обыскал в неправильном месте. Проблема заключается в запросе кросс-домена (CORS) и угловом2. Ссылка нажала на один шаг дальше this.http.get ('http: // ...', {withCredentials: true}). Теперь следующие запросы также содержат cookie в заголовке. У меня все еще есть проблема, так как cookie отличается от отправки с сервера как set-cookie. Этого не происходит, если вызов не является CORS. – FGHJ

1

Все, что вы вкладываете в контекст сеанса, недоступно для клиентов, оно доступно только для сервера. см. this stack overflow post за хорошее объяснение того, как работают сервлеты, и, в частности, о том, как работает сеанс.

Как вы можете видеть, это работает, добавляя к файлу cookie сеанса cookie, который содержит идентификатор сеанса. Сервер сохраняет состояние сеанса под этим идентификатором в памяти, а когда в будущем запросе приходит этот идентификатор сеанса, он снова возвращает состояние сеанса в будущий запрос.

Если ваши следующие запросы не имеют доступа к состоянию сеанса, вполне возможно, что cookie сеанса не распространяется должным образом. Я предлагаю вам сначала проверить это. Он должен быть в ответе, где вы входите в систему, и должны быть отправлены в дальнейшие запросы на сервер.