我有一个要求,即后端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。
期待获得答案以扩展我对该主题的理解:)