HttpServletRequestWrapper是否与RequestDispatcher一起使用

时间:2014-05-06 19:41:20

标签: java java-ee servlets model-view-controller httprequest

我有一个要求,即后端Spring控制器期望请求头中的某些值,即某些自定义头。

视图中,jsp有一个html表单,可以将参数从最终用户提交给控制器。由于无法使用XMLHttpHeader从html表单或javascript函数发送自定义标头。在这种情况下,我无法使用XMLHttpHeader,因为这将是一个AJAX调用,在我的情况下,我想要一个表单提交。

我唯一的选择是,添加一个中介servlet,它将拦截来自jsp的调用,从请求参数中读取值,然后将它们添加为请求头并将它们转发到最终控制器。由于无法在HttpServletRequest中添加自定义标头,因此我使用了HttpServletRequestWrapper,如下所示。 example

问题是将它转发给Spring控制器,代码如下

MockHttpRequestWrapper req = new MockHttpRequestWrapper(request);
req.addHeader("REMOTE_USER", ssoId);
req.addHeader("REALM", realmId);
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(req, response);

其中MockHttpRequestWrapper是一种HttpServletRequestWrapper,根据示例

public class MockHttpRequestWrapper extends HttpServletRequestWrapper {

private Map customHeaderMap = null;

public MockHttpRequestWrapper(HttpServletRequest request) {
    super(request);
     customHeaderMap = new HashMap();
}

 public void addHeader(String name,String value){
      customHeaderMap.put(name, value);
     }

     @Override
     public String getParameter(String name) {
      String paramValue = super.getParameter(name); // query Strings
      if (paramValue == null) {
       paramValue = (String) customHeaderMap.get(name);
      }
      return paramValue;
     }

}

我还没有使用过滤器对样本进行测试,但我希望与RequestDispatcher一起使用。调用最终控制器,但找不到标题。

同一个Request对象是否未传递给控制器​​?在控制器中代码

request.getHeader("REMOTE_USER")

返回null。

期待获得答案以扩展我对该主题的理解:)

0 个答案:

没有答案