目录
一、访问swagger-ui.hyml页面出错
1.1 情况1
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:428) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.32.jar:8.5.32]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.32.jar:8.5.32]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]
2018-10-28 16:32:04.295 INFO 96428 --- [nio-8089-exec-9] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:428) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.32.jar:8.5.32]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.32.jar:8.5.32]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]
请求头的问题,不要用https访问,用http。
1.2 情况2
返回401,未授权。因为订单服务配置了拦截器,来获取用户信息,所以会拦截所有访问该端口的请求,当访问swagger-ui时直接将请求发送到了controller中,导致访问失败。
具体看拦截器配置:
拦截所有根目录下的请求,根据网关的配置可以得到,访问订单微服务的url为:http://api.leyou.com/api/order/
所以此时如果访问swagger-ui时,使用的路径为:http://localhost:8089/swagger-ui.html ,这里面的前半部分:http://localhost:8089就相当于http://api.leyou.com/api/order/(通过nginx反向代理),所以为了区分访问路径,在网关配置中就不指定order前缀了,将其放在controller中进行配置。
这样配置完成后,进入controller时就必须带前缀order了,但是此时访问还是会造成401错误,因为配置了拦截器,访问根目录下的所有路径都会进行用户是否登录的检测,所以在拦截器中将访问swagger-ui的路径过滤掉:
再次访问http://localhost:8089/swagger-ui.html就不会被转发到controller中引发401错误了。
注意,引发401错误的可能还注解:@EnableWebMvc。
后期在处理Long类型数据以json形式返回时的问题,会配置一个转换器,要用到这个注解。在进行接口测试时将其注释掉。
二、无法加载swagger-ui.html页面中的静态资源
通过第一步的修改后,可以访问页面,但是页面空白。
打开控制台,刷新页面:
发现静态资源无法加载,同样,还是因为拦截器的原因。
具体查看静态资源,会发现它们都在一个webjars的路径下,那么直接过滤掉这个路径即可:
效果:
静态资源都加载成功,但是又有新的问题
三、出现弹窗,无法访问
点击发生错误的请求:
发现产生这个问题的原因是无法加载swagger的资源文件,还是因为拦截器的问题,那么过滤掉即可:
最后结果:
四、总结
无法访问swagger-ui最主要的原因都是拦截器的问题(如果配置了的话)
拦截器代码:
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> excludePath = new ArrayList<>();
excludePath.add("/swagger-ui.html");
excludePath.add("/swagger-resources/**");
excludePath.add("/webjars/**");
registry.addInterceptor(loginInterceptor())
.addPathPatterns("/**").excludePathPatterns(excludePath);
}