Spring 根据@RequestParam在@RestController中选择@ResponseBody模型

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,

我们的Spring Boot RestController中有以下方法:

@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
Will
httpServletResponse.sendRedirect(“auth/login1”)生成一个新的GET请求?是的,但它会解决您的问题,这也是spring安全成功与失败处理程序的工作原理。谢谢。我将看看这个.will
httpServletResponse.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);
        }
    }