gpt4 book ai didi

java - 修复 key=javax.servlet.http.HttpServletResponse 的 No PolicyContextHandler 异常

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:42 25 4
gpt4 key购买 nike

我使用 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)

正在获取请求对象,但没有获取响应对象。如何解决这个问题?

最佳答案

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

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 响应。

关于java - 修复 key=javax.servlet.http.HttpServletResponse 的 No PolicyContextHandler 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14353879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com