1

我正在使用 Jboss 5.1.0

在我的 bean 中,我想获取Response对象并使用它来将一些值设置回cookie.

下面是我在 bean 中的代码,

HttpServletResponse response = null;
response = (HttpServletResponse) PolicyContext.getContext("javax.servlet.http.HttpServletResponse"); 
//Line number 1230


HttpServletRequest req = null;
req = (HttpServletRequest) PolicyContext.getContext("javax.servlet.http.HttpServletRequest");

Cookie[] cookies =  req.getCookies();

for(int i=0;i<cookies.length;i++)
 {
   if(cookies[i].getName().contains("myCookie"))
                {
                    cookies[i].setValue("");
                    cookies[i].setPath("/");
                    cookies[i].setMaxAge(0);
                    response.addCookie(cookies[i]);
                }
}

但是,在第 1230 行的异常情况下

java.lang.IllegalArgumentException: No PolicyContextHandler for key=javax.servlet.http.HttpServletResponse
13:24:16,457 ERROR [STDERR]     at javax.security.jacc.PolicyContext.getContext(PolicyContext.java:107)
13:24:16,457 ERROR [STDERR]     at myPackage.myBean(myBean.java:1230)
13:24:16,457 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
13:24:16,457 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
13:24:16,457 ERROR [STDERR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
13:24:16,457 ERROR [STDERR]     at java.lang.reflect.Method.invoke(Method.java:597)
13:24:16,457 ERROR [STDERR]     at org.apache.el.parser.AstValue.invoke(AstValue.java:170)
13:24:16,457 ERROR [STDERR]     at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
13:24:16,457 ERROR [STDERR]     at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
13:24:16,457 ERROR [STDERR]     at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
13:24:16,457 ERROR [STDERR]     at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
13:24:16,457 ERROR [STDERR]     at javax.faces.component.UICommand.broadcast(UICommand.java:387)
13:24:16,457 ERROR [STDERR]     at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)
13:24:16,457 ERROR [STDERR]     at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:304)
13:24:16,457 ERROR [STDERR]     at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261)

我得到request对象但不是response对象。如何解决这个问题?

4

1 回答 1

1

PolicyContext在托管 bean 中使用是不必要的。在托管 bean 中,您已经可以直接访问HttpServletRequestHttpServletResponse通过ExternalContext.

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
// ...

PolicyContext仅在您无法直接访问它们的服务类(如 EJB)中有用。您的具体问题是因为PolicyContext根本不记得 HTTP servlet 响应,而只记得 HTTP servlet 请求,因为有关当前登录用户的信息存储在那里。本质上,HTTP servlet 响应与策略上下文无关。

请注意,ExternalContext它还提供了一种方便的getRequestCookieMap()方法,该方法返回所有 cookie 的映射,因此您无需手动遍历Cookie[].

Cookie cookie = (Cookie) externalContext.getRequestCookieMap().get("myCookie");
// ...

我知道您使用的是 JSF 1.2,但如果您使用的是 JSF 2.0 或更新版本,那么您也可以使用方便的addResponseCookie()方法来添加 cookie,而无需获取“原始”servlet 响应。

于 2013-01-16T11:05:19.920 回答