我想通过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";
}
}
答案 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";
}
}