在调用使用@RequestHeader的控制器方法之前更改请求标头

时间:2014-04-13 16:41:03

标签: spring

我有一些控制器使用@RequestHeader注释来获取登录用户。在调用方法之前,我似乎无法找到更改标头的正确方法。 我已经尝试包装请求并使用拦截器(在预处理方法中,如果我没有弄错)并传递请求,但似乎没有查询标头。 servlet调度程序抛出一个异常,即标头中缺少用户名。 因此,我想知道是否有人知道spring如何以及何时处理此注释,因此我可以编写适当的拦截器。

手头没有代码,但如果需要,我稍后会发布片段。但问题很简单:当在控制器方法上使用@RequestHeader时,如何在请求头中注入一个参数?

亲切的问候, 汤姆

首先编辑: @Sotirios 我尝试使用过滤器,它可以工作。但这对我来说不如handlerinterceptor方便。因为我只需要过滤器进行调试。所以再一个更好的问题:为什么这不能用拦截器?

public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
    final HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(httpRequest) {

        @Override
        public Enumeration getHeaders(String name) {
            Enumeration headers = super.getHeaders(name);
            if( isUseFilter() && Constants.REMOTE_USER.equalsIgnoreCase(name) ){
                String user = super.getHeader(name);
                headers = enumeration(asList(isEmpty(user)? getDebuggingUserId() :user));
            }
            return headers;
        }
    };
    chain.doFilter(wrapper, response);
}

0 个答案:

没有答案