spring-boot 允许接口跨域并实现拦截(CORS)

作者: madisoon | 来源:发表于2017-08-18 09:50 被阅读223次
    pom.xml(依赖的jar)
    // 在spring-boot-starter-web的启动器中,已经依赖好了
    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    CORS跨域的配置(主要配置允许什么样的方法跨域)
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * Created by Msater Zg on 2017/4/3.
     */
    @Configuration
    public class CorsConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowCredentials(true)
                    .allowedMethods("GET", "POST", "DELETE", "PUT")
                    .maxAge(3600);
        }
        private CorsConfiguration buildConfig() {
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            List<String> list = new ArrayList<>();
            list.add("*");
            corsConfiguration.setAllowedOrigins(list);
            /*
            // 请求常用的三种配置,*代表允许所有,当时你也可以自定义属性(比如header只能带什么,只能是post方式等等)
            */
            corsConfiguration.addAllowedOrigin("*");  
            corsConfiguration.addAllowedHeader("*"); 
            corsConfiguration.addAllowedMethod("*");  
            return corsConfiguration;
        }
        @Bean
        public CorsFilter corsFilter() {
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", buildConfig());
            return new CorsFilter(source);
        }
    }
    
    拦截器配置(可以根据不同路径,配置不同的拦截器)
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * Created by Msater Zg on 2017/4/5.
     * 拦截器
     */
    public class ApiInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 请求前调用
            System.out.println("拦截了");
            return true;
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            // 请求过程中调用
            System.out.println("拦截了");
        }
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            // 请求完成时调用
            System.out.println("拦截了");
        }
    }
    
    拦截器管理类,用于生成项目的拦截器链
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    /**
     * Created by Msater Zg on 2017/4/5.
     * 拦截器管理工具
     */
    @Configuration
    public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 多个拦截器组成一个拦截器链
            // addPathPatterns 用于添加拦截规则
            // excludePathPatterns 用户排除拦截
            registry.addInterceptor(new ApiInterceptor()).addPathPatterns("/user/**");  //对来自/user/** 这个链接来的请求进行拦截
            super.addInterceptors(registry);
        }
    }
    
    结语

    实现跨域的方式有很多,这只是其中一种。有什么不对的地方希望能及时指出。谢谢!

    相关文章

      网友评论

      • ec2f0c089b6d:使用你的方式弄好了,不过cors配置里面addCorsMappings方法可以不用重写了,用CorsFilter的bean就足够了
        madisoon:好的,谢谢提示

      本文标题:spring-boot 允许接口跨域并实现拦截(CORS)

      本文链接:https://www.haomeiwen.com/subject/dimorxtx.html