2013-04-12 80 views
7

Sono nuovo alla programmazione web. Sto chiedendo un modello comune per fare cose come il controllo dell'autenticazione. Ecco lo scenario:Come la pagina JSP deve controllare l'autenticazione

Il sito Web dispone di una pagina di accesso per i visitatori. Richiederà il nome utente e la password crittografata e li invierà al server, quindi otterrà un codice di errore (nome utente/password non corrispondono) o una chiave di autenticazione dal server. Quando l'utente ha effettuato l'accesso con successo, voglio che il sito web passi automaticamente alla pagina main.jsp che presenta la funzionalità principale del sito web.

In questo caso, voglio main.jsp controllare l'autenticazione dell'utente. Cioè, non voglio che una cosa del genere accada come l'utente possa aprire direttamente www.example.com/main.jsp, e se facessero cose del genere, voglio reindirli alla pagina di login.

Quindi, come è possibile passare le informazioni di autenticazione sulla pagina e come impedire all'utente di accedere direttamente allo main.jsp senza effettuare l'accesso? Devo usare la sessione o altro?

+3

se ho capito bene, a quanto pare quello che ti serve è il filtraggio sulla tua app Web ...potresti provare a leggere questo http://docs.oracle.com/javaee/5/api/javax/servlet/Filter.html –

risposta

14

si potrebbe provare a utilizzare filtri:

filtro può pre-processo una richiesta prima che raggiunga una servlet, post-elaborazione di una risposta lasciando un servlet o entrambi. I filtri possono intercettare, esaminare e modificare richieste e risposte.

NOTA: assicurarsi di aggiungere un attributo sessione una volta che l'utente è collegato, è possibile utilizzare l'attributo sessione sul filtro

sul login.jsp aggiuntivo:

session.setAttribute("LOGIN_USER", user); 
//user entity if you have or user type of your user account... 
//if not set then LOGIN_USER will be null 

web.xml

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <!--url-pattern>/app/*</url-pattern--> 
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering --> 
</filter-mapping> 

SessionCheckFilter.java

public class SessionCheckFilter implements Filter { 

    private String contextPath; 

    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    contextPath = fc.getServletContext().getContextPath(); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session... 
     res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to redirect 
    } else { 
     String userType = (String) req.getSession().getAttribute("LOGIN_USER"); 
     if (!userType.equals("ADMIN")){ //check if user type is not admin 
     res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to 
     } 
     fc.doFilter(request, response); 
    } 
    } 

    @Override 
    public void destroy() { 
    } 
} 
5

Come pagina JSP deve verificare l'autenticazione

Non dovrebbe. È necessario utilizzare l'autenticazione gestita dal contenitore e definire il login/sicurezza in web.xml tramite i pattern URL.


Aggiunto da Glen migliore:

Ad es Aggiungere qualcosa di simile a web.xml:

<security-constraint> 
    <display-name>GET: Employees Only</display-name> 
    <web-resource-collection> 
     <web-resource-name>Restricted Get</web-resource-name> 
     <url-pattern>/restricted/employee/*</url-pattern> 
     <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>Employee</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
+0

L'autenticazione gestita dal contenitore è definita nella specifica servlet. È abbastanza ufficiale per te? – EJP

+0

Utilizzare decisamente questo e non codificare la propria soluzione! È il modo previsto. –

+0

Non solo, ma in base alle specifiche della piattaforma JEE, il contenitore Web conoscerà i ruoli e l'identità dell'utente, consentendo l'integrazione automatica con EJB, JCA, ecc. E consentendo l'accesso programmatico tramite API standard e E.g. request.isUserInRole (ruolo), request.getUserPrinciple() e simili da EJB –

0

Questo funziona anche per me

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <!--url-pattern>/app/*</url-pattern--> 
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering --> 
</filter-mapping> 


public class SessionCheckFilter implements Filter { 

    private String contextPath; 

    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    contextPath = fc.getServletContext().getContextPath(); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session... 
     req.getRequestDispatcher("login.jsp").forward(req, resp); //or page where you want to redirect 
    } else { 
     String userType = (String) req.getSession().getAttribute("LOGIN_USER"); 
     if (userType.equals("ADMIN")){ //check if user type is admin 
     fc.doFilter(request, response); it redirected towards main.jsp 
     } 

    } 
    } 

    @Override 
    public void destroy() { 
    } 
} 
-4

Come sull'utilizzo:

String username = request.getRemoteUser(); 
Problemi correlati