Сессия Struts 2 в перехватчике

Я пытаюсь получить доступ к объекту сеанса из своего перехватчика, реализуя интерфейс 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), поэтому, если пользователь не вошел в систему, он не позволит ему войти на веб-сайт, а если он вошел в систему, по крайней мере, его имя пользователя должно быть там в сеансе . Разве это не должно быть?


person Sachin Midha    schedule 12.08.2011    source источник
comment
Вам необходимо предоставить более подробную информацию о том, когда имя пользователя помещается в сеанс. Как проходит вход в систему?   -  person Steven Benitez    schedule 14.08.2011
comment
Имя пользователя kerberos размещается внутри сеанса перехватчиком servlet-config. Но он размещает его только по второму запросу, и это вызывает у меня проблему...   -  person Sachin Midha    schedule 16.08.2011
comment
ServletConfigInterceptor устанавливает значения для действий, но ничего не помещает в сеанс. В нынешнем виде ваш вопрос не дает мне достаточно информации, чтобы помочь вам. Содержит ли HttpServletRequest.getUserPrincipal() нужную вам информацию о пользователе?   -  person Steven Benitez    schedule 16.08.2011
comment
Ok. Но я получаю эти значения при втором вызове действия внутри моего сеанса. Как я это понимаю? servlet-config должен помещать его во время/после выполнения действия, может быть? Я проверю с помощью getUserPrincipal() и дам вам знать. Но будет ли этот userPrincipal установлен до того, как выполнение достигнет какого-либо действия?   -  person Sachin Midha    schedule 16.08.2011
comment
Не верьте мне на слово, посмотрите на источник ServletConfigInterceptor. Он ничего не помещает в сессию. Он просто вводит различные вещи в ваше действие. :) И да, принципал пользователя должен быть установлен до вызова вашего действия.   -  person Steven Benitez    schedule 16.08.2011


Ответы (5)


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

public String intercept( ActionInvocation actionInvocation ) throws Exception {
    Map session = actionInvocation.getInvocationContext().getSession();
person Shawn D.    schedule 12.08.2011
comment
Да, я пробовал это. Оба этих метода дают мне пустой сеанс в первый раз. - person Sachin Midha; 12.08.2011
comment
Разве сессия не будет пустой в первый раз, пока вы не добавите в нее что-нибудь? - person Shawn D.; 12.08.2011
comment
Нет, этого не должно быть, потому что я захожу на свой веб-сайт через безопасное соединение, поэтому, если пользователь не вошел в систему, веб-сайт запросит у него его учетные данные... - person Sachin Midha; 12.08.2011
comment
У вас будет сеанс, только если ваш перехватчик зарегистрирован после перехватчика createSession по умолчанию. - person arpadf; 14.03.2019

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

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

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

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

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

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

person Steven Benitez    schedule 12.08.2011
comment
Да, я могу создать сеанс, но это не то, что я могу сделать в моем случае. Мне нужно получить имя пользователя kerberos из сеанса, поэтому создание сеанса мне бесполезно. Надеюсь, вы поняли мою точку зрения. - person Sachin Midha; 12.08.2011
comment
Что помещает имя пользователя kerberos в сеанс? - person Steven Benitez; 12.08.2011
comment
разве он не должен быть там, если пользователь вошел в систему? Я получаю имя пользователя автоматически при втором вызове действия, и я ничего не сделал, чтобы поместить его во второй запрос. - person Sachin Midha; 14.08.2011
comment
Нет, вещи не просто появляются в вашем сеансе. Вы должны положить их туда. - person Steven Benitez; 14.08.2011
comment
Ok. Так как же имя пользователя попадает в мою сессию по второму запросу? Что-то должно быть там установлено, и это не я. Итак, как мне узнать, что там установлено? Кроме того, имя пользователя даже не поступает из метода request.getUser(). Тогда как мне получить имя пользователя kerberos? - person Sachin Midha; 15.08.2011

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

public String intercept(ActionInvocation ai) throws Exception {

     Map session = ActionContext.getContext().getSession(); 
person Prabhakar Manthena    schedule 14.05.2013

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

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

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

HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession(true);
person Pravin Mandge    schedule 06.02.2017

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

import org.apache.struts2.StrutsStatics;
person abc    schedule 08.11.2016
comment
Не могли бы вы добавить дополнительную информацию о том, почему этот импорт полезен? - person Tom Leys; 09.11.2016