HttpServletRequestWrapper

HttpServletRequestWrapper

我有一个标准的Spring MVC控制器(为REST调用提供服务),如下所示:

@Controller
public class SpringRestController {
    @RequestMapping({"/message"})
    @ResponseBody
    public Message getMessage(@RequestParam(required=false) String username, HttpServletRequest request) {
        return new Message("Hello " + username);
    }
}


我的理解是Spring MVC将调用HttpServletRequest.getParameter(“ username”)并将结果注入“ username”方法参数中。

但是我的原始请求不包含“用户名”参数。我查找另一个请求参数,构造一个“用户名”值,并将其设置在HttpServletRequestWrapper实现中(使用自定义过滤器)。像这样:

public class UserResolvingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        filternChain.doFilter(
            new HttpServletRequestWrapper(request) {
                @Override
                public String getParameter(String name) {
                    return getParameterMap().get(name);
                }
                @Override
                public Map<String, String[]> getParameterMap() {
                    Map<String, String[]> map = new HashMap(super.getParameterMap());
                    // Simplified for brevity
                    map.put("username", new String[] {"testUserName"});
                    return map;
                }

            },
            response
        );
    }
}


过滤器在web.xml中进行配置,如下所示:

<filter>
    <filter-name>userResolvingFilter</filter-name>
    <filter-class>my.package.UserResolvingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>userResolvingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


问题:我的getMessage控制器方法中的username参数始终为null。我已经确认


筛选器已成功调用。
Spring使用其他几个参数名称调用我的HttpServletRequestWrapper.getParameter(String name)匿名实现,但从未使用“ username”调用。
Spring不会调用HttpServletRequestWrapper.getParameterMap()的匿名实现。不知道是否应该。
“ request”参数(在getMessage()方法中)是的一个实例
HttpServletRequestWrapper。


我想知道怎么回事?

注意:为了使问题保持​​简单,我仅介绍了相关代码并进行了一些修改。请忽略语法错误(如果有)。

最佳答案

我很惊讶代码被编译。
从给出的代码

return getParameterMap().get(name);

应该返回一个String [],但是包含该代码的方法正在返回一个String。

我可能会丢失一些东西。

08-04 03:23