springMVC-跨域问题

springMVC中,前端访问restful服务时,经常会有跨域问题。目前本人用到过的解决方案有两种,一种是利用springframework的UrlBasedCorsConfigurationSource类进行跨域设置,另一种是写filter拦截http请求,在请求头中进行跨域的设置,代码写法如下。

1. 利用springframework的UrlBasedCorsConfigurationSource类

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        final FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    }
}

2.filter拦截http请求,在请求头中进行跨域的设置

i.编写filter

public class SimpleCORSFilter implements Filter {

    private Logger logger = LoggerFactory.getLogger(SimpleCORSFilter.class);

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        String origin = request.getHeader("Origin");

        if (origin != null) {
            response.setHeader("Access-Control-Allow-Origin", origin);
        }
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Content-Type");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        if ("OPTIONS".equals(request.getMethod())) {
            response.setStatus(HttpStatus.OK.value());
        } else {
            chain.doFilter(req, res);
        }
    }

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }
}

ii.在webMvcConfig中注册该filter

@Configuration
//@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public FilterRegistrationBean simpleCORSFilter() {
        SimpleCORSFilter simpleCORSFilter = new SimpleCORSFilter();
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(simpleCORSFilter);
        List<String> urlPatterns = Lists.newArrayList("/*");
        filterRegistrationBean.setUrlPatterns(urlPatterns);
        filterRegistrationBean.setOrder(-100);
        return filterRegistrationBean;
    }
}
posted @ 2021-07-29 11:24  MVPMVD  阅读(193)  评论(0)    收藏  举报