Используя cookie с Struts 2 и Struts

У меня есть следующее (сокращенное) 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, таким образом, я думал бы, что это должно становиться названным - я пропустил что-то здесь?

Спасибо

10
задан Denees 9 December 2011 в 08:40
поделиться

2 ответа

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

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

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, что является бонусом. Так что я доволен этим решением, даже если оно окрашивает стойки2 при плохом освещении.

10
ответ дан 3 December 2019 в 21:19
поделиться

Вам также необходимо реализовать Перехватчик файлов cookie для определения действия в вашем 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>
5
ответ дан 3 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: