Spring: наследование контроллера с использованием аннотации @Controller

Я хотел бы иметь возможность создать базовый контроллер в моем приложении Spring, который, среди прочего, определяет, является ли пользователь зарегистрированным пользователем или нет. Этот базовый контроллер, следуя шаблону проектирования шаблона, будет содержать абстрактный защищенный метод, который будут реализовывать подклассы контроллера.

Абстрактный метод передал бы ему экземпляр пользователя, зарегистрированного или иного. Однако я понятия не имею, как бы я это сделал, поскольку кажется, что при использовании контроллеров исключительно с использованием аннотации @Controller каждый контроллер может свободно определять свой метод обработки запросов, как им нравится.

Будет ли одним из способов обойти это создание какого-то класса обслуживания пользователей, который внедряется в каждый контроллер и используется для проверки пользователя? Возникает вопрос (по крайней мере, для меня), как такой контроллер получает объект HttpServletRequest или Session?

Спасибо.


person richever    schedule 27.01.2010    source источник


Ответы (3)


Я думаю, что базовый контроллер - не очень хорошая идея, если единственный код, который он должен иметь, предназначен для 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

}

Это помогло?

-SB

person SB.    schedule 27.01.2010
comment
Спасибо, СБ, я думал об этом, но сейчас собираю некоторые мнения по этому поводу. Я серьезно рассматриваю Spring Security, но также хочу избежать дублирования кода везде - мне нужно прочитать о Spring Security. - person richever; 27.01.2010

  1. Определите abstract BaseController без аннотаций
  2. Определение конкретных и абстрактных методов
  3. Вызывайте эти методы из подклассов (с аннотацией @Controller) всякий раз, когда это необходимо.
person Bozho    schedule 27.01.2010
comment
Спасибо, Божо, я примерно так и думал. Я ценю ответ. - person richever; 27.01.2010
comment
Но что, если некоторые конкретные методы в BaseController нуждаются в доступе к некоторым службам с автоматическим подключением? Я представляю себе BaseController с общим @Autowired private UserService userService. Означает ли это, что abstract BaseController также должен быть снабжен аннотацией @Controller, чтобы автосвязывание работало? - person Albert Gan; 08.05.2012

Основная проблема заключается в том, что аннотационная начальная загрузка не является полиморфной. Я нашел этот документ полезным: http://sanguinecomputing.com/design-pattern-for-hierarchical-controller-organization-with-annotational-configuration-spring-mvc-3/

person Forelight    schedule 28.04.2013
comment
Было бы полезно, если бы вы могли обобщить статью здесь. - person ChrisF; 29.04.2013