Struts 2 Session в перехватчике - PullRequest
3 голосов
/ 12 августа 2011

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

Затем я попытался ActionContext.getContext().getSession() и смог получить сеанс, но я не знаю, но он становится пустым только в первый раз в каждом браузере для каждого пользователя, а затем он заполняется, когда вызывается другое действие,

Полагаю, что с сеансом что-то не так.Почему это дает мне пустую сессию только в первый раз?Устанавливает ли он что-либо только после первого пустого сеанса?

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

Или я неправильно получаю сеанс?

Я видел код для получения сеансов в перехватчиках, но это не работает для меня, так как не может найти константу HTTP_REQUEST.

final ActionContext context = invocation.getInvocationContext();

HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);

HttpSession session = request.getSession(true);

Object user = session.getAttribute(Constants.USER_HANDLE);

Есть ли какие-либо предложения по решению любой из проблем?

Что-то, что я забыл упомянуть - мой сайт является безопасным сайтом (https), поэтому, если пользователь не вошел в систему,не позволил бы ему войти на сайт, и если он вошел в систему, по крайней мере, его имя пользователя должно быть там в сеансе.Разве это не должно быть?

Ответы [ 5 ]

3 голосов
/ 12 августа 2011

У меня есть перехватчик, который также захватывает сессию как карту.Вы пробовали что-то подобное?Это работает для меня.

public String intercept( ActionInvocation actionInvocation ) throws Exception {
    Map session = actionInvocation.getInvocationContext().getSession();
0 голосов
/ 06 февраля 2017

Вы можете получить сеанс на Interceptor, используя сам ActionContext ... обратитесь к следующему фрагменту кода:

SessionMap<String, Object> session = ActionContext.getContext().getSession();

или, альтернативно, вы можете использовать следующий подход: запрос доступен для экземпляра ActionContext, которыйдоступно через ThreadLocal.

HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession(true);
0 голосов
/ 09 ноября 2016

Добавить импорт:

import org.apache.struts2.StrutsStatics;
0 голосов
/ 14 мая 2013

Попробуй это. У меня это работало в стойках 2.0.14.

public String intercept(ActionInvocation ai) throws Exception {

     Map session = ActionContext.getContext().getSession(); 
0 голосов
/ 12 августа 2011

Вы можете использовать следующее, чтобы вернуть HttpSession - и создать его, если он не существует.

HttpSession session = ServletActionContext.getRequest().getSession(true);

Если вам нужна карта вместо этого, то вы можете просто вызвать ее сразу после этого последнего вызова (поскольку вы передали true, сеанс был бы создан, и следующий вызов вернет пустую карту сеанса).

Map<String, Object> session = ActionContext.getContext().getSession();

В качестве альтернативы, вы можете использовать CreateSessionInterceptor в начале стека, чтобы сеанс создавался к тому времени, когда вам это нужно. Затем просто используйте приведенный выше пример карты, чтобы получить его.

К вашему сведению: ServletActionContext - это подкласс ActionContext, в котором есть удобные методы для получения запроса и ответа без необходимости использования констант, как вы пытались в своем примере.

...