Spring:使用@Controller注释的控制器继承

ric*_*ver 7 spring annotations controller single-table-inheritance

我希望能够在我的Spring应用程序中创建一个基本控制器,除其他外,它确定用户是否是注册用户.遵循模板设计模式的此基本控制器将包含控制器子类将实现的抽象受保护方法.

抽象方法会将一个User实例传递给它,注册或以其他方式.但是,我不知道如何做到这一点,因为通过使用纯粹使用@Controller注释的控制器,每个控制器都可以自由地定义他们的请求处理方法.

是否会创建一种注入每个控制器并用于验证用户的某种用户服务类是解决此问题的一种方法?这引出了一个问题(至少对我而言)这样的控制器是如何获得HttpServletRequest或Session对象的?

谢谢.

Boz*_*zho 14

  1. 定义一个abstract BaseController,没有注释
  2. 定义具体和抽象的方法
  3. @Controller在需要时从子类(带注释)调用这些方法.

  • 但是,如果BaseController中的一些具体方法需要访问一些自动服务的服务呢?我想象一个BaseController有一个共同的`@Autowired private UserService userService`.这是否意味着`abstract BaseController`也应该用`@Controller`注释以使自动装配工作? (2认同)

SB.*_*SB. 1

我认为如果基本控制器唯一的代码是用于 UserAuthentication...而不是使用 Spring 安全性,那么它不是一个好主意。这是最好的选择。

或者,您可以使用这样的方法...看看 Spring 参考..

@Controller("loginController")
public class LoginController {    

   @RequestMapping(value="/login.do", method=RequestMethod.POST)
   public String login(Model model, HttpServletRequest request) {

      String userIdFromRequest = (String)request.getParameter("userId");
      String password = (String)request.getParameter("password");

      boolean verified = ...send userIdFromRequest and password to the user service for 
      verification...

      if (verified){
        request.getSession().setAttribute("userId", userIdFromRequest);
      }

   }          

   //More Methods

}
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

-SB