Spring 根据@RequestParam在@RestController中选择@ResponseBody模型
我们的Spring Boot RestController中有以下方法:Spring 根据@RequestParam在@RestController中选择@ResponseBody模型,spring,spring-mvc,spring-boot,Spring,Spring Mvc,Spring Boot,我们的Spring Boot RestController中有以下方法: @RequestMapping(value = USER_LOGIN_URL, method = { RequestMethod.POST }) public ResponseEntity<TokenResponse> localAuth( @Validated @RequestBody(required = true) AuthRequest authRequest,
@RequestMapping(value = USER_LOGIN_URL, method = { RequestMethod.POST })
public ResponseEntity<TokenResponse> localAuth(
@Validated @RequestBody(required = true) AuthRequest authRequest,
@RequestParam(required = true) String provider) {
// ... voodoo magic ...
return ResponseEntity.status(HttpStatus.OK).body(new TokenResponse("abc"));
}
@RequestMapping
注释有一个params
属性,在这种情况下非常方便,正如您在我的示例中看到的那样
在这里,您可以看到当提供者查询字符串等于“someProvider”
时触发的控制器方法:
@RequestMapping
注释有一个params
属性,在这种情况下非常方便,正如您在我的示例中看到的那样
在这里,您可以看到当提供者查询字符串等于“someProvider”
时触发的控制器方法:
如果只是为了登录,你还可以做一件事 创建一个过滤器,该过滤器将拦截url并决定要执行的身份验证类型 在Filter的doFilter()方法中,您可以截取url并根据自定义提供程序重定向
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
if (httpServletRequest.getRequestURI().equals("/login") && httpServletRequest.getParameter("provider").equals("provider1")) {
httpServletResponse.sendRedirect("auth/login1");
} else if (httpServletRequest.getRequestURI().equals("/login") && httpServletRequest.getParameter("provider").equals("provider2")) {
httpServletResponse.sendRedirect("auth/login2");
}else {
chain.doFilter(request,response);
}
}
并使用不同的控制器方法来处理身份验证
另外,请记住将
@Order(1)
添加到您的过滤器。如果只是为了登录,您还可以做一件事
创建一个过滤器,该过滤器将拦截url并决定要执行的身份验证类型
在Filter的doFilter()方法中,您可以截取url并根据自定义提供程序重定向
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
if (httpServletRequest.getRequestURI().equals("/login") && httpServletRequest.getParameter("provider").equals("provider1")) {
httpServletResponse.sendRedirect("auth/login1");
} else if (httpServletRequest.getRequestURI().equals("/login") && httpServletRequest.getParameter("provider").equals("provider2")) {
httpServletResponse.sendRedirect("auth/login2");
}else {
chain.doFilter(request,response);
}
}
并使用不同的控制器方法来处理身份验证
还记得将
@Order(1)
添加到您的筛选器中。“我们希望使用不同的请求模型”请详细说明。我自己找到的。答案贴在下面。“我们想使用不同的请求模型”请详细说明。我自己发现的。答案贴在下面。第二个例子仍然有AuthRequest
required=true
是默认值。您在新方法中是否使用了provider
?参数是如何传递的?它是标题的一部分吗?@Srikanta它是一个类似http://example.com/auth?provider=someProvider
第二个示例仍然有AuthRequest
required=true
是默认值。您在新方法中是否使用了provider
?参数是如何传递的?它是标题的一部分吗?@Srikanta它是一个类似http://example.com/auth?provider=someProvider
WillhttpServletResponse.sendRedirect(“auth/login1”)代码>生成一个新的GET请求?是的,但它会解决您的问题,这也是spring安全成功与失败处理程序的工作原理。谢谢。我将看看这个.willhttpServletResponse.sendRedirect(“auth/login1”)代码>生成一个新的GET请求?是的,但它会解决您的问题,这也是spring安全成功与失败处理程序的工作原理。谢谢。我来看看这个。
@RequestMapping(value = "/auth/login", method = { RequestMethod.POST },
params = "provider=someOtherProvider")
public ResponseEntity<TokenResponse> localAuth(
@Validated @RequestBody(required = true) SomeSpecialAuthRequest authRequest,
@RequestParam(required = true) String provider) { ... }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
if (httpServletRequest.getRequestURI().equals("/login") && httpServletRequest.getParameter("provider").equals("provider1")) {
httpServletResponse.sendRedirect("auth/login1");
} else if (httpServletRequest.getRequestURI().equals("/login") && httpServletRequest.getParameter("provider").equals("provider2")) {
httpServletResponse.sendRedirect("auth/login2");
}else {
chain.doFilter(request,response);
}
}