文章目录
作为一个强迫症重度的程序猿 不想多导一个jar包
本文创作背景是鉴于网上大多数是旧版本swagger2的教程,且没有针对2和3区别描述,话不多说 直接步入正题。
导包正确方式
如果只需要knife4j文档 导这一个包就够了 这里以3.0+版本举例
(对springboot比较熟悉的同学应该清楚 starter目的就是将其它包并入一个包 旨在开箱即用 一个正确的stater 会把其它杂七杂八的包 都包含在里面)
<!-- 如果只需要knife4j文档 导这一个包就够了 --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>
如果还想同时使用swagger界面 那么需要额外加一个包:
<!--可选,引入后,原/swagger-ui.html提供的页面仍可正常使用--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>3.0.0</version></dependency>
如果不想用knife4j 只想用swagger 不需要上面的包 那么只需要下面这个包:
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>
本文是基于security环境 security的jar包:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
swagger2在security中放行
在swagger2中,根据大部分教程 我们的放行姿势 是经典的四件套:
/webjars/**
/swagger-resources/**
/v2/**
/swagger-ui/**
代码示例如下:
@ConfigurationpublicclassSecuritySecureConfigextendsWebSecurityConfigurerAdapter{/** WebSecurity 不走过滤链的放行 即不通过security 完全对外的/最大级别的放行 **/@Overridepublicvoidconfigure(WebSecurity web)throwsException{// test直接放行了 如果是login接口 必须通过HttpSecurity 走过滤链 因为登录涉及 SecurityContextHolder
web.ignoring().antMatchers("/test/**");}@Overrideprotectedvoidconfigure(HttpSecurity http)throwsException{// 登录成功处理类SavedRequestAwareAuthenticationSuccessHandler successHandler =newSavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
http.authorizeRequests()//静态文件允许访问.antMatchers("/assets/**").permitAll().antMatchers("/webjars/**").permitAll().antMatchers("/swagger-resources/**").permitAll().antMatchers("/v2/**").permitAll().antMatchers("/swagger-ui/**").permitAll()// 放行.antMatchers("/login","css/**","/js/**","/image/*").permitAll()//其他所有请求需要登录, anyRequest 不能配置在 antMatchers 前面.anyRequest().authenticated().and()//登录页面配置,用于替换security默认页面// .formLogin().loginPage( "/login").successHandler(successHandler).and()//登出页面配置,用于替换security默认页面// .logout().logoutUrl( "/logout").and().httpBasic();}}
这段代码基本正确,但是有个隐患 : /v2/**
如果有同学遇到v2版本的开发, 且将接口以/v2开头 将造成严重后果
所以博主推荐 不要为了省事那么写 最好写全: /v2/api-docs
swagger3在security中放行
当某一天 我们版本迭代升级 更新到swagger3的时候,用上面配置 会发现swagger、knife都无法访问 这这这为什么呢?
下面提一下博主的分析思路:
knife4j放行失败原因分析:
其它配置未改变 只是starter版本升级 导致的放行失败 一般可以推测是两个原因:
- security 机制改变 正确放行姿势 不再是
http.authorizeRequests() .antMatchers("/xxx/**").permitAll()
但是我们应该明白 swagger只是一个额外的文档工具 它不应该去改变security的机制 所以这点我们可以排除 - 放行失败 说明url被拦截,url被拦截 那就意味着升级后 文档地址可能发生了改变
- 所以我们可以先将security的jar包先去除,观察knife4j文档页面:
由此我们可知 需要新增一行放行代码:
.antMatchers("/v3/api-docs").permitAll()
再将security包 重新加回项目中
swagger访问失败原因分析:
knife4j是因为url的变更 那swagger有没有也是这种可能呢?
我们之前(swagger2)的访问url是
localhost:8080/swagger-ui.html
这个地址是怎么来的呢?
html是在swagger-ui jar包中
那再看看swagger3中 它变成了什么:
没错 名字发生了改变,我们在swagger3中的正确访问url为:
localhost:8080/swagger-ui/index.html
响应结果没有内容问题
例如我们封装了一个Result类 作为统一的返回结果类,需要补全泛型,如:
publicResult<People>getPeopleList(){returnnewResult(xxxx)}
版权归原作者 孟秋与你 所有, 如有侵权,请联系我们删除。