【问题标题】:Using cookies with Struts 2 and Struts在 Struts 2 和 Struts 中使用 cookie
【发布时间】:2011-03-22 00:03:53
【问题描述】:

我有以下(缩短的)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 接口,所以我会认为它应该被调用 - 我在这里错过了什么吗?

谢谢

【问题讨论】:

  • 或者我在这里违背了原则 - 我真的应该使用会话吗?会话是 struts2 中更“有福”的做事方式吗?
  • 我要去看看这个:omkarp.blogspot.com/2007/08/…
  • 在我看来,使用 'map' 方法对于读取 cookie 不是很好 - 因为您必须在拦截器引用中指定您想要(或全部)的 cookie,但它仍然无论如何都会尝试将它们注入到 setter 中,如果找不到任何 setter 则会崩溃!
  • 最后我决定struts2对cookies的支持太小了,我只是打算使用ServletRequest/Response来分别获取/设置它们。我现在正在使用它,效果很好。

标签: java cookies struts2


【解决方案1】:

看来struts只支持读取cookies,你得去servlet响应才能真正设置一个cookie。

最后,我选择完全绕过 struts2 cookie 支持,直接进入 servlet 请求/响应对象进行读写:

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。

【讨论】:

  • 这是否意味着您需要在每个需要使用 cookie 的操作上实现响应和请求接口?那么如果你需要从另一个类调用这个类,你需要将第一个类的响应、请求对象传递给这个类对吗?
【解决方案2】:

您还需要为 struts.xml 中的操作定义实现 Cookie Interceptor

<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>

【讨论】:

  • 当然!更多 XML 配置!愚蠢的我:我忘记了我正在使用 Java,我应该猜到我需要一些 xml ;)
  • 好的,现在我已经添加了 cookie 配置,它不会再将我的属性连接到输入元素了!我在控制台中收到许多类似以下的错误: 13016 [http-7080-2] WARN org.apache.struts2.util.TextProviderHelper - ValueStack (actions.jobs.Search) 中的第一个 TextProvider 无法找到消息资源key 'division' 13016 [http-7080-2] WARN org.apache.struts2.util.TextProviderHelper - 默认值表达式'division'评估为'0'
  • 哈哈,总是用 XML。如果您在我的示例中进行了定义,则意味着您的默认拦截器堆栈不再被调用。查看我更新的代码(大约 30 秒),了解如何解决此问题。
  • 非常感谢您的帮助。好的,我已经把“defaultStack”线放进去,你是对的,它修复了输入接线。但是这些 cookie 似乎是一种安慰剂——它们会编译,运行时我使用它们时没有记录警告,但它们根本什么都不做。
  • 嗯,有趣...我没有在我的 Struts2 应用程序中使用 cookie,但看起来默认的 Cookie 拦截器仅用于将 cookie 用于您的操作 - 它不允许您设置他们......我用谷歌搜索了一下,发现这篇文章看起来很有希望:omkarp.blogspot.com/2007/11/… 它概述了创建一个自定义 cookie 拦截器,允许您在操作中处理后将 cookie 添加到响应中。
【解决方案3】:

虽然我知道这个问题现在已经超过 3 年了,但今天我需要使用 Struts2 设置一个 cookie,登陆这里,并设法以 Struts2-y 方式设置 cookie(使用 2.3.16)。希望这对其他人有所帮助。

要使用 Struts2 设置 cookie,您需要执行以下步骤:

  1. 让您的 Action 实现 org.apache.struts2.interceptor.CookieProvider。 (你可能想看看它的javadoc
  2. 实现Set&lt;Cookie&gt; getCookies();方法,返回所有你想设置的cookie。
  3. 让你的 Action 使用 cookieProvider interceptor,就像他在回答中提到的 @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。

【讨论】:

    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2013-09-28
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      相关资源
      最近更新 更多