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