在一开始把OAuth2的认证服务器和资源服务器搭在同一个项目中,一开始使用/oauth/token使用password方式能够成功取得jwt Token但是之后在写了一个controller之后发现认证请求已经无效了
浏览器端报405
POST http://localhost:8081/oauth/token 405
后端显示方法不支持
2019-03-05 08:45:14.030 WARN 8564 --- [nio-8081-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
2019-03-05 08:45:14.031 DEBUG 8564 --- [nio-8081-exec-3] o.s.web.servlet.DispatcherServlet : Completed 405 METHOD_NOT_ALLOWED
2019-03-05 08:45:14.034 DEBUG 8564 --- [nio-8081-exec-3] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for POST "/error", parameters={grant_type:[password], username:[user], password:[123456], scope:[all]}
2019-03-05 08:45:14.039 DEBUG 8564 --- [nio-8081-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2019-03-05 08:45:14.066 DEBUG 8564 --- [nio-8081-exec-3] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]
2019-03-05 08:45:14.067 DEBUG 8564 --- [nio-8081-exec-3] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [{timestamp=Tue Mar 05 08:45:14 CST 2019, status=405, error=Method Not Allowed, message=Request metho (truncated)...]
2019-03-05 08:45:14.100 DEBUG 8564 --- [nio-8081-exec-3] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 405
明显是因为我自定义的controller方法出问题了。
因此我先去查看/oauth/token的入口类 TokenEndPoint.java 发现上面有@FrameworkEndpoint注解,此注解和@controller类似,但是是用于框架级的路由注解,不会和用户定义的冲突,因此我怀疑我自己的注解把 OAuth2的注解给覆盖了。
在最后的测试下发现由于我自己的api采用rest风格 在类上写着 @RestController(“abc”) 于是在方法上只写了 @GetMapping 后面没有value值,所以导致问题。
最后把 restcontroller 上的 value 移到 getmapping 中问题解决
@RestController//后面可以不加value
public class UserController {
/**
* 获取所有信息
* @return
*/
@GetMapping("/user")//后面必须加value
public List<UserInfo> queryAll(){
UserInfo u1 = new UserInfo(1,"uuz",17);
UserInfo u2 = new UserInfo(1,"uuz",17);
UserInfo u3 = new UserInfo(1,"uuz",17);
List<UserInfo> us = new ArrayList<>();
us.add(u1);
us.add(u2);
us.add(u3);
return us;
}
}