代码之家  ›  专栏  ›  技术社区  ›  Chris

将cookies与Struts 2和Struts结合使用

  •  10
  • Chris  · 技术社区  · 15 年前

    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 回复  |  直到 13 年前
        1
  •  10
  •   Chris    15 年前

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

        2
  •  5
  •   Marco Borchert Sarvjeet Ahuja    7 年前

    您还需要实现 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>
    
        3
  •  2
  •   orique Gustaf    11 年前

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

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

    1. 让你的行动付诸实施 org.apache.struts2.interceptor.CookieProvider . (你可能想看看它 javadoc
    2. Set<Cookie> getCookies();
    3. cookieProvider interceptor 就像帕特在回答中提到的那样。
    <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
  •  0
  •   rajnish    10 年前