从Java调用Controller方法

时间:2019-05-21 17:49:25

标签: java rest spring-boot spring-mvc

我想通过Java类调用Controller的方法,因此我可以返回特定的视图。在这种情况下,我有一个简短的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调用,但这似乎不是正确的方法。

AuthService:

@Service
public class AuthService {

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

Views Controller:

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

}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

Controller类通常用于根据您的业务逻辑重定向应用程序流。尽管可以从服务中调用controller方法,但controller中所有方法中的大多数都带有@RequestMapping注释,但由于Controller的返回类型是特定视图的结果,因此它无法实现目的。 您必须编写AuthenticationFailureHandler的实现才能实现该功能。春季安全性很容易实现

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");
} }

在“安全性”类中调用该类

@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);
      }

答案 2 :(得分:0)

控制器必须根据用户请求确定要调用的服务。
该服务不能确定控制器。
我认为这不是好习惯。
您的控制器应如下所示:

@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";
    }
}