2

具体来说,我希望整个控制器发送“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", "*");

有什么方法可以在一个地方为一个或多个控制器设置这个?

4

2 回答 2

1

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

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

@Configuration
@EnableWebMvc
public class MyWebConfiguration extends WebMvcConfigurerAdapter {
    ...
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(...).addPathPatterns("/controller/base/**");
    }
    ...
}
于 2013-06-28T15:00:28.880 回答
0

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

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

  • 在用 注释的方法中设置响应头@InitBinder
  • 使用注释类以@ControllerAdvice使其在全局范围内处理 @InitBinder。
于 2013-06-28T15:28:46.840 回答