2010-01-27 5 views
7

Mi piacerebbe essere in grado di creare un controller di base nella mia app Spring che, tra le altre cose, determina se un utente è un utente registrato o meno. Questo controller di base, seguendo il modello di progettazione del modello, conterrebbe un metodo protetto astratto che le sottoclassi del controller implementerebbero.Sorgente: ereditarietà del controllore usando l'annotazione @Controller

Il metodo astratto avrebbe passato ad esso un'istanza di Utente, registrata o in altro modo. Tuttavia, non ho idea di come farei questo poiché sembra che usando i controller usando esclusivamente l'annotazione @Controller ogni controller sia libero di definire il loro metodo di gestione delle richieste come preferiscono.

La creazione di una sorta di classe di servizio utente immessa in ogni controller e utilizzata per convalidare un utente è un modo per aggirare questo problema? Questo solleva la domanda (almeno per me) in che modo un controller di questo tipo ottiene una sospensione di HttpServletRequest o dell'oggetto Session?

Grazie.

risposta

1

Penso che il controller di base non è una buona idea se l'unico codice che deve avere è UserAuthentication ... invece di usare Spring Security. Questa è l'opzione migliore.

In alternativa, si può avere metodi come questo ... dare un'occhiata al riferimento di primavera ..

@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 

} 

ti ha aiutato?

-SB

+0

Grazie SB, l'ho considerato, ma ho raccolto alcune opinioni su questo al momento. Sto seriamente pensando a Spring Security ma voglio anche evitare la duplicazione del codice ovunque - ho bisogno di leggere su Spring Security però. – richever

13
  1. Definire un abstract BaseController, senza annotazioni
  2. definire i metodi astratti e concreti
  3. chiamare questi metodi da sottoclassi (che sono annotati con @Controller) in caso di necessità.
+0

Grazie Bozho, è una specie di cosa stavo pensando. Apprezzo la risposta. – richever

+2

Ma cosa succede se alcuni metodi concreti nel BaseController devono accedere ad alcuni servizi autowired? Immagino un BaseController che abbia un comune "userService utente privato @Autowired". Questo significa che anche il 'BaseController astratto 'dovrebbe essere annotato con' @ Controller' per far funzionare l'autowiring? – bertie