【发布时间】:2014-01-22 19:19:03
【问题描述】:
我需要在 Struts2 拦截器(不是动作类)中设置 ServletRequest 属性。
ActionContext 是否公开Map<String, Object> 来控制请求属性,就像它对会话属性所做的那样?
我看到ActionContext 实现了一个地图。 ActionContext 本身是请求属性的包装器吗?
【问题讨论】:
标签: struts2 actioncontext
我需要在 Struts2 拦截器(不是动作类)中设置 ServletRequest 属性。
ActionContext 是否公开Map<String, Object> 来控制请求属性,就像它对会话属性所做的那样?
我看到ActionContext 实现了一个地图。 ActionContext 本身是请求属性的包装器吗?
【问题讨论】:
标签: struts2 actioncontext
ActionContext 包含一个保存请求对象的请求键。回答你的问题:不,ActionContext 不是请求的包装器,但是 Struts2 中的请求是 servlet 请求的包装器。
您可以从动作上下文中获取request,例如
HttpServletRequest request = ServletActionContext.getRequest();
这种方式在拦截器中很有用,但更好地实现ServletRequestAware
protected HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
【讨论】:
request 这样的上下文键。披露它可能会给您的应用程序带来安全问题。
request OGNL 无法访问':为什么这很重要?你为什么要提起 OGNL? “安全问题”:解释一下。我下面的方法是首选,因为它避免了暴露 servlet API。如果您阅读该链接,您会看到它明确表示不推荐您的答案 ServletActionContext.getRequest(),并且首选我的方法。
对于不在动作类中的代码(RequestAware 应该用于动作类),Struts2 可以将 servlet 请求属性公开为 Map。可通过以下方式访问它们:
Map request = (Map) ActionContext.getContext().get("request");
更多详情请见Strus2 documentation。
【讨论】: