【问题标题】:Call Controller method from Java从 Java 调用 Controller 方法
【发布时间】:2019-10-08 04:14:54
【问题描述】:

我想通过 Java 类调用控制器的方法,这样我就可以返回一个特定的视图。在这种情况下,我有一个简短的 ID 列表;如果当前用户的 ID 不在该列表中,则重定向到一个视图 invalidUser。

我可以在客户端使用 Ajax 或按钮:onclick="location.href='/invalidUser'

但我不清楚如何从 Java 类调用 ViewsController 的 invalidUser() 方法。

如何在 invalidUserRedirect() 方法中使用 Java 执行此操作?我正在考虑从 HttpServletRequest 获取基本 URL,如下所示:Get Root/Base Url In Spring MVC 然后对 baseUrl + "/invalidUser" 进行 http 调用,但这似乎不是正确的方法。

授权服务:

@Service
public class AuthService {

  public void invalidUserRedirect(HttpServletRequest request) {
    // Make call to invalidUser() in ViewsController
  }
}

视图控制器:

@Controller
public class ViewsController {
  @RequestMapping(value = "/invalidUser", method = {RequestMethod.GET})
  public String invalidUser() {
    return "invalid";
  }

}

【问题讨论】:

  • 这里有什么要求?为什么要从服务中调用控制器?
  • 简单地说,即使你设法从服务中调用控制器方法,结果也不会是a specific view,而是字符串invalid
  • @Boris 试着重新思考你的目标是什么。它是调用控制器中的方法,还是返回特定的渲染视图?
  • 你可以做的是从你的服务中抛出一个定制的异常并在@ExceptionHandler中捕获它。然后你返回一个带有重定向的响应。

标签: java rest spring-boot spring-mvc


【解决方案1】:

控制器必须根据用户请求确定调用哪些服务。
该服务无法确定控制器。
我认为这不是一个好习惯。
你的控制器应该是这样的:

@Controller
public class ViewsController {

    @Autowired
    private UserValidator userValidator;

    @RequestMapping(value = "/testUser", method = { RequestMethod.GET })
    public String testUser(UserInfo userInfo) {
        //call service
        boolean isValidUser = userValidator.test(userInfo);
        if(isValidUser)
            return "validUserPage";
        else
            return "invalid";
    }
}

【讨论】:

    【解决方案2】:

    Controller 类通常用于根据您的业务逻辑重定向应用程序流。控制器中的大多数方法都标有@RequestMapping注解,即使您可以从服务中调用控制器方法,它也无法实现目的,因为控制器的返回类型是生成特定视图。 您必须编写 AuthenticationFailureHandler 的实现来实现该功能。这很容易通过 spring security 实现

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.security.core.AuthenticationException;
    import org.springframework.security.web.authentication.AuthenticationFailureHandler;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyAuthenticationFailureHandler  implements AuthenticationFailureHandler{
    
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException exception) throws IOException, ServletException {
        request.setAttribute("param", "invaliduser");
        response.sendRedirect("/domain/?error");
    } }
    

    在Security类中调用这个类

    @Autowired
     MyAuthenticationFailureHandler failureHandler;
    
      @Override
      protected void configure(HttpSecurity http) throws Exception {
      http.formLogin()
                    .loginPage(LOGIN_URL)
                    .failureUrl(LOGIN_URL + "?error").permitAll()
                    .authenticationDetailsSource(authDetailsSource)
                    .successHandler(successHandler)
                    .failureHandler(failureHandler);
          }
    

    【讨论】:

      【解决方案3】:

      从您的浏览器调用控制器类。您不应该从您的服务类中调用 Controller 方法。你的控制器方法应该调用你的服务类

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 2018-02-19
        • 2018-04-04
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        相关资源
        最近更新 更多