Java 将cookie与Struts 2和Struts一起使用

Java 将cookie与Struts 2和Struts一起使用,java,cookies,struts2,Java,Cookies,Struts2,我有以下(缩短的)struts2动作: public class MyAction extends BaseAction implements CookiesAware { public String execute() { if (cookiesMap.containsKey("BLAH")) blah=Integer.parseInt(cookiesMap.get("BLAH")); return "success"; } // For h

我有以下(缩短的)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;
  }
}
公共类MyAction扩展BaseAction实现CookiesAware{
公共字符串execute(){
如果(cookiesMap.containsKey(“废话”))
blah=Integer.parseInt(cookiesMap.get(“blah”);
返回“成功”;
}
//用于处理cookies
地图;
@凌驾
公共void setCookiesMap(映射cookiesMap){
this.cookiesMap=cookiesMap;
}
}
当我执行“cookiesMap.containsKey”时,我得到一个空指针异常——在我看来,setCookiesMap没有被调用。我已经实现了CookiesAware接口,所以我认为应该调用它——我是否错过了一些东西


谢谢

您还需要为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>

废话
/index.jsp

struts似乎只支持读取cookie,您必须转到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。

虽然我知道这个问题已经有3年多的历史了,但今天我需要用struts2设置一个cookie,在这里着陆,并设法以struts2-y方式设置cookies(使用2.3.16)。希望这能对其他人有所帮助

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

  • 让您的操作实现
    org.apache.struts2.interceptor.CookieProvider
    。(您可能想看看它的)
  • 实现
    设置getCookies()
    
  • 使用
    cookieProvider
    进行操作,方法与@Pat在回答中提到的相同
  • 
    /index.jsp
    

    如果您为cookie设置了一个域,那么在测试此设置时,请确保您正在该域下请求URL。在我的例子中,我没有意识到我是在直接访问我的测试机器,而不是通过域访问,并且没有设置cookie。

    下面的文章详细介绍了如何使用cookie感知接口

    当然!更多的XML配置!愚蠢的我:有一分钟我忘了我正在使用Java,我应该猜到我需要一些xml;)好的,现在我已经添加了cookies配置,它将不再把我的属性连接到输入元素!我的控制台中出现了许多类似以下的错误:13016[http-7080-2]WARN org.apache.struts2.util.TextProviderHelper-ValueStack(actions.jobs.Search)中的第一个TextProvider无法找到键为'division'13016[http-7080-2]的消息资源WARN org.apache.struts2.util.TextProviderHelper-默认值表达式'division'计算为'0'哈哈,始终使用XML。如果您在我的示例中定义了,这意味着您的默认侦听器堆栈不再被调用。请参阅我的更新代码(大约30秒)以了解如何修复此问题。非常感谢您的帮助。好的,我已经把“defaultStack”行放进去了,你是对的,它修复了输入接线。但是cookies似乎是一种安慰剂——它们是编译的,当运行时,我使用它们时没有记录警告,但它们什么也不做。嗯,有趣的是……我在Struts2应用程序中没有使用cookies,但看起来默认的Cookie拦截器只用于将cookies放入您的操作中——它不允许您设置它们。。。我在谷歌上搜索了一下,发现这篇文章看起来很有希望:它概述了如何创建一个自定义cookie拦截器,允许您在操作中处理后将cookie添加到响应中。或者我在这里是否违反了规则?我真的应该改为使用会话吗?会话是struts2中更“幸运”的做事方式吗?我要检查一下:在我看来,使用“映射”方法对读取cookies不是很好——因为你必须在拦截器引用中指定你想要(或全部)的cookies,但它仍然试图将它们注入setter中,如果找不到任何二传手就崩溃了!最后,我认为struts2对cookies的支持太小了,我将使用ServletRequest/Response分别获取/设置它们。我现在正在使用它,它工作得很好。这是否意味着您需要在需要使用cookie的每个操作上实现响应和请求接口?那么如果你需要从另一个类调用这个类,你需要将第一个类的响应,request objects传递给这个类,对吗?请看一下这个问题
    <action name="MyAction" class="your.fancy.app.MyAction">
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="cookieProvider"/>
        <result>/index.jsp</result>
    </action>