Использование куки с Struts 2 и Struts - PullRequest
10 голосов
/ 28 июля 2010

У меня есть следующее (сокращенное) действие struts2:

public class MyAction extends BaseAction implements CookiesAware {

  public String execute() {

    if (cookiesMap.containsKey("BLAH"))
      blah=Integer.parseInt(cookiesMap.get("BLAH"));

      return "success";
  }

  // For handling cookies
  Map<String, String> cookiesMap;
  @Override
  public void setCookiesMap(Map<String, String> cookiesMap) {
    this.cookiesMap = cookiesMap;
  }
}

Я получаю исключение нулевого указателя, когда я делаю 'cookiesMap.containsKey' - мне кажется, что setCookiesMap не вызывается,Я реализовал интерфейс CookiesAware, так что я подумал бы, что он должен вызываться - я что-то здесь пропустил?

Спасибо

Ответы [ 4 ]

10 голосов
/ 29 июля 2010

Похоже, что Struts поддерживает только чтение файлов cookie, вы должны перейти к ответу сервлета на фактический набор файла cookie.

В конце концов, я решил обойти распорки2поддержка cookie полностью и непосредственно к объектам запроса / ответа сервлета для чтения и записи:

public class MyAction extends ActionSupport implements ServletResponseAware, ServletRequestAware {

  public int division;

  public String execute() {

    // Load from cookie
    for(Cookie c : servletRequest.getCookies()) {
      if (c.getName().equals("cookieDivision"))
        division=Integer.parseInt(c.getValue());
    }

    // Save to cookie
    Cookie div = new Cookie("cookieDivision", String.format("%d",division));
    div.setMaxAge(60*60*24*365); // Make the cookie last a year
    servletResponse.addCookie(div);

    return "success";
  }

  // For access to the raw servlet request / response, eg for cookies
  protected HttpServletResponse servletResponse;
  @Override
  public void setServletResponse(HttpServletResponse servletResponse) {
    this.servletResponse = servletResponse;
  }

  protected HttpServletRequest servletRequest;
  @Override
  public void setServletRequest(HttpServletRequest servletRequest) {
    this.servletRequest = servletRequest;
  }
}

И для этого метода не требуется настройка ни в struts.xml, ни в web.xml, что является бонусом,Так что я доволен этим решением, даже если оно рисует Struts2 при плохом освещении.

5 голосов
/ 28 июля 2010

Вам также необходимо реализовать Cookie Interceptor для определения действия в вашем struts.xml:

<action name="MyAction" class="your.fancy.app.MyAction">
    <interceptor-ref name="defaultStack"/>       
    <interceptor-ref name="cookie">
        <param name="cookiesName">BLAH</param>
    </interceptor-ref>
    <result>/index.jsp</result>
</action>
2 голосов
/ 11 февраля 2014

Хотя я знаю, что этому вопросу уже более 3 лет, сегодня мне нужно было установить cookie со Struts2, приземлился здесь, и мне удалось установить cookie в Struts2-y (используя 2.3.16).Надеюсь, что это поможет некоторым другим.

Чтобы установить куки со Struts2, вам необходимо выполнить следующие шаги:

  1. Сделайте так, чтобы ваше действие реализовало org.apache.struts2.interceptor.CookieProvider.(Возможно, вы захотите увидеть его javadoc )
  2. Реализуйте метод Set<Cookie> getCookies();, возвращая все куки, которые вы хотите установить.
  3. Сделайте свое действие, используя cookieProvider перехватчик так же, как @Pat упоминал в своем ответе.
<action name="MyAction" class="your.fancy.app.MyAction">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="cookieProvider"/>
    <result>/index.jsp</result>
</action>

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

0 голосов
/ 01 ноября 2014

Следующая статья содержит более подробную информацию о том, как использовать интерфейс с поддержкой cookie http://www.journaldev.com/2203/how-to-get-servlet-session-request-response-context-attributes-in-struts-2-action

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