如何为整个Spring Framework控制器发送相同的头文件?

时间:2013-06-28 14:51:30

标签: java spring spring-mvc

具体来说,我希望整个控制者发送“Access-Control-Allow-Origin = *”。

我在下面试过,但这似乎不起作用:

@Controller
@RequestMapping(value = "/controller/base", headers="Access-Control-Allow-Origin=*")
public class UserController {
    @RequestMapping(method = RequestMethod.GET, value = "/blah", produces = application/json")
    @ResponseBody
    public Map blah(/*...,*/ HttpServletResponse response, HttpServletRequest request) throws Exception {
        //...
    }
}

只有当我明确设置(在所有方法中)时才会起作用:

response.addHeader("Access-Control-Allow-Origin", "*");

以某种方式为一个地方的一个或多个控制器设置这个?

2 个答案:

答案 0 :(得分:1)

据我所知,没有办法从控制器本身拦截控制器的所有方法(除了使用@InitBinder之类的丑陋黑客)。

但是,您可以创建HandlerInterceptor并将其应用于控制器的基本URL。例如,使用@EnableMvc

@Configuration
@EnableWebMvc
public class MyWebConfiguration extends WebMvcConfigurerAdapter {
    ...
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(...).addPathPatterns("/controller/base/**");
    }
    ...
}

答案 1 :(得分:0)

考虑使用Spring 3.2中引入的@ControllerAdvice annotation,并结合@InitBinder。

  
    

“使用@ControllerAdvice注释的类可以包含@ ExceptionHandler,@ InitBinder和@ModelAttribute方法,这些方法将应用于跨控制器层次结构的@RequestMapping方法,而不是声明它们的控制器层次结构。@ ControllerAdvice是组件注释允许通过类路径扫描自动检测实现类。“

  
  • 在使用@InitBinder注释的方法中设置响应标头。
  • 使用@ControllerAdvice注释该类以使其全局处理@InitBinder。