【问题标题】:Get/set ServletRequest attributes from ActionContext从 ActionContext 获取/设置 ServletRequest 属性
【发布时间】:2014-01-22 19:19:03
【问题描述】:

我需要在 Struts2 拦截器(不是动作类)中设置 ServletRequest 属性。

ActionContext 是否公开Map<String, Object> 来控制请求属性,就像它对会话属性所做的那样?

我看到ActionContext 实现了一个地图。 ActionContext 本身是请求属性的包装器吗?

【问题讨论】:

    标签: struts2 actioncontext


    【解决方案1】:

    ActionContext 包含一个保存请求对象的请求键。回答你的问题:不,ActionContext 不是请求的包装器,但是 Struts2 中的请求是 servlet 请求的包装器。

    您可以从动作上下文中获取request,例如

    HttpServletRequest request = ServletActionContext.getRequest();
    

    这种方式在拦截器中很有用,但更好地实现ServletRequestAware

    protected HttpServletRequest request;
    
    public void setServletRequest(HttpServletRequest request) {
      this.request = request;
    }
    

    【讨论】:

    • 我正在寻找请求属性,而不是参数
    • 我的回答如下:它展示了如何只获取请求属性映射(而不是整个 servlet 请求对象)。
    • 好的,但是你的回答并没有回答这个问题,你自己可能不明白。请注意,发现在代码中使用此类硬编码值。 OGNL 也无法访问像 request 这样的上下文键。披露它可能会给您的应用程序带来安全问题。
    • 为了解决您的问题...“硬编码值不好”:我在 Struts2 文档中引用了该方法。 'request OGNL 无法访问':为什么这很重要?你为什么要提起 OGNL? “安全问题”:解释一下。我下面的方法是首选,因为它避免了暴露 servlet API。如果您阅读该链接,您会看到它明确表示不推荐您的答案 ServletActionContext.getRequest(),并且首选我的方法。
    【解决方案2】:

    对于不在动作类中的代码(RequestAware 应该用于动作类),Struts2 可以将 servlet 请求属性公开为 Map。可通过以下方式访问它们:

    Map request = (Map) ActionContext.getContext().get("request");
    

    更多详情请见Strus2 documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多