美文网首页
springboot Swagger2集成和使用

springboot Swagger2集成和使用

作者: BeeHoney | 来源:发表于2018-12-29 16:59 被阅读0次

    说明

         我们在开发rest 接口时,肯定需要调试,然后自己需要额外安装 如postman等工具,还要自己写脚本数据进行调试,也不方便管理。所幸 springboot有提供 swagger插件功能。
    和别的技术教程区别是,我配置的是 maven打包为jar文件和使用security框架进行鉴权的情况下的配置:

    首先:
        我们引入需要的maven依赖:

            <!-- web支持-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!--security 安全框架-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <!--swagger-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.7.0</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.7.0</version>
            </dependency>
    

    采用bean注册的方式进行swagger的配置。

    @Configuration
    @EnableSwagger2
    @Profile({"local","dev"})//只有这些环境才可以用
    public class SwaggerConfig {
    
        @Value("${spring.application.name}")
        private String projectName;
        /**
         * 全局参数
         * 增加 header 头的一个参数 Authorization 用于校验api
         *
         * @return
         */
        private List<Parameter> parameter() {
            List<Parameter> params = new ArrayList<>();
            params.add(new ParameterBuilder().name("Authorization")
                    .description("通过用户密码获取授权token,--header 'Authorization:$token'")
                    .modelRef(new ModelRef("string"))
                    .parameterType("header")
                    .defaultValue("")
                    .required(false).build());
            return params;
        }
    
    
        @Bean
        public Docket sysApi() {
            String pkname = new SwaggerConfig().getClass().getPackage().getName();
            //配置需要被api扫描的包路径,只会显示该包下的api
            pkname = pkname.substring(0,pkname.lastIndexOf("."))+".controller";
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.basePackage(pkname))
                    .paths(PathSelectors.any())
                    .build().globalOperationParameters(parameter());
                    //.securitySchemes(newArrayList(oauth()))
                   // .securityContexts(newArrayList(securityContext()));
        }
    
        /**
        * info
        *  配置api视图显示的信息
        * @param
        * @return
        * @throws
        */
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title(projectName+" API DEBUG")
    //                .description(" api 调试")
                    .termsOfServiceUrl("")
    //                .contact("shengshengsheng")
                    .version("1.0")
                    .build();
        }
    
    }
    

    因为是jar方式运行服务,静态页面会找不到路径,然后配置:

    @EnableWebMvc
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
            registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/");
            registry.addResourceHandler("swagger-ui.html").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/META-INF/resources/");
            registry.addResourceHandler("/webjars/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/META-INF/resources/webjars/");
    
            super.addResourceHandlers(registry);
        }
    }
    

    因为加了security的配置,我们需要排除一些路径的鉴权

    @EnableWebSecurity
    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        //1. 依靠用户标识危害网站,2. 利用网站对用户标识的信任,欺骗用户的浏览器发送HTTP请求给目标站点,可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击
        //防御CSRF(跨站请求伪造)可以通过动态token验证的方式来实现,每次请求生成一个动态token给前端,前端在后续的请求中附加该token,如果token不存在或不正确说明不是正常请求,予以屏蔽,从而达到解决CSRF问题的目的// @formatter:off
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .csrf().disable() //禁用跨站请求伪造功能
                    .authorizeRequests()
                    .antMatchers(
                            "/info",
                            "/api",
                            "/v2/api-docs",
                            "/swagger-resources/**",
                            "/swagger-ui.html**",
                            "/webjars/**",
                            "/medical-provider/api-docs",
                            "/static/**",
                            "/druid/**",
                            "/error/**"
                    ).permitAll()
                    .antMatchers("/**").authenticated();
    
        }
    }
    
    

    然后做一下路由跳转:

    /**
        *  跳转api调试页面
        * @param
        * @return
        * @throws
        */
        @RequestMapping("/api")
        public String api() {
            return "redirect:/swagger-ui.html";
        }
    

    就可以愉快的进行访问了。
    访问路径 : http://localhost:8080/api

    更多,请关注:
    springboot 技术实践总结

    相关文章

      网友评论

          本文标题:springboot Swagger2集成和使用

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