source code for Spring OAuth2's AuthorizationEndpoint包含两个针对同一@RequestMapping
个端点的冗余/oauth/authorize
注释。其中一个指定POST
方法,而另一个未指定方法。
如何解释两个@RequestMapping
注释?指定POST
的请求是否专门处理所有POST /oauth/authorize
个请求,并且未指定方法的请求是否专门处理对non-POST
的任何/oauth/authorize
个请求?或者两种方法都重叠,两种方法都被调用了某些请求?
这可能是一个Spring MVC问题,尽管GitHub上的源代码使用Spring MVC来定义什么是Spring OAuth2。
虽然GitHub上的完整源代码可以在本OP顶部的链接上找到,但两个相关方法的标题总结如下:
@RequestMapping(value = "/oauth/authorize")
public ModelAndView authorize(Map<String, Object> model, @RequestParam Map<String, String> parameters,
SessionStatus sessionStatus, Principal principal) {
//other stuff
}
@RequestMapping(value = "/oauth/authorize", method = RequestMethod.POST, params = OAuth2Utils.USER_OAUTH_APPROVAL)
public View approveOrDeny(@RequestParam Map<String, String> approvalParameters, Map<String, ?> model,
SessionStatus sessionStatus, Principal principal) {
//other stuff
}
答案 0 :(得分:2)
这已经解释过in the official documentation:如果您提供method
字段的值,它们将用于缩小映射。换句话说:Spring MVC将使用这些提示为每个请求找到最精确的匹配。
构建一个简单的概念验证应用程序也很容易,它在实践中展示了它:
@RequestMapping("/foo")
@ResponseBody
public String hello() {
return "hello, default";
}
@RequestMapping(value="/foo", method = RequestMethod.GET)
@ResponseBody
public String helloGet() {
return "hello, GET";
}
使用GET请求命中/foo
,例如使用Postman,将返回“hello,GET”。所有其他支持的HTTP方法(POST,PUT,DELETE等)将导致“hello,default”。
答案 1 :(得分:-1)
Spring请求映射使用的默认方法是 GET ,因此如果您指定仅包含@RequestMapping
注释的请求映射,Spring会将所有GET请求路由到注释的值这种方法。
要使用任何其他方法,您基本上需要在注释中说出方法。比如@RequestMapping(method = RequestMethod.POST
)
因此,对于您的示例,第一个方法将仅处理GET请求,而另一个方法将仅处理POST请求。
通常,OAuth中的GET用于正常解释,而POST用于使用传递给方法的param对未经身份验证的用户进行身份验证,在本例中为OAuth2Utils.USER_OAUTH_APPROVAL
。
答案 2 :(得分:-1)
如何解释两个@RequestMapping注释?
首先,从http://javatechig.com/java/spring/how-spring-controller-request-mapping-works-in-spring-mvc开始,默认值被解释为GET
。这是第一个区别。其次,方法1请求Map<String, String>
和另一种方法Map<String, ?>
时,两种方法的参数略有不同。因此,即使两个方法都是GET
,它仍然会在参数级别上进行区分。
指定POST的那个是否专门处理所有POST / oauth / authorize请求,并执行未指定的请求 方法专门处理对/ oauth / authorize的任何非POST请求? 或者两种方法重叠,两种方法都被确定 请求?
POST
专门处理帖子而不是其他内容。另一种方法只处理GET
个请求。他们从不重叠。正如java的法律和Spring
仍然受到java霸主的规则约束=)