Implementeremo le Session in Java per avere persistenza dei dati tra le varie pagine web del nostro sito modificando il codice della lezione Java Salvare i dati su un database .
In quella lezione abbiamo provveduto alla registrazione di un utente del nostro sito memorizzando le sue credenziali in un apposita tabella del database.
- Login dell’utente
- Creazione della sessione
- Accesso alle pagine riservate agli utenti che hanno effettuato il login
- Link utili
Login dell’utente
Creiamo una pagina jsp che permetta all’utente, previa registrazione, di accedere al sito inserendo email e password in un apposito form:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login </title>
</head>
<body>
<form action="LoginServlet" method="POST">
<table>
<tr>
<td>Email: </td>
<td><input type="email" name="email" maxlength="60"></td>
<td>Password: </td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit"></td>
<td><input type="reset"></td>
</tr>
</table>
</form>
</body>
</html>
per poter controllare se l’utente è presente nel database dobbiamo implementare l’apposito metodo searchUser(String email, String password)
nella classe DbManager.java
public static UserBean searchUser(String email, String password) throws SQLException {
PreparedStatement pstmt=null;
Connection conn=null;
UserBean userBean = null;
try {
userBean=new UserBean();
conn=getDBConnection();
pstmt=conn.prepareStatement("SELECT * FROM users WHERE email=? AND password=?");
pstmt.setString(1, email);
pstmt.setString(2,password);
ResultSet res=pstmt.executeQuery();
System.out.println("La query: "+pstmt.toString());
while(res.next()){
userBean.setEmail(res.getString("email"));
userBean.setPassword(res.getString("password"));
}
}catch(Exception e) {
}
return userBean;
}
Il metodo restituisce un oggetto della classe userBean che rappresenta il nostro utente, con l’istruzione
pstmt=conn.prepareStatement("SELECT * FROM users WHERE email=? AND password=?");
prepariamo la query, nota l’utilizzo del carattere jolly ? dopo email= e password= questo verrà rimpiazzato dall’effettivo valore delle variabili che passiamo al metodo con le seguenti istruzioni
pstmt.setString(1, email);
pstmt.setString(2,password);
è facile dedurre che il primo argomento del metodo setString
ovvero il numero è l’ordine dei parametri che dobbiamo sostituire ai ?
nella query
Dopodiché creiamo un oggetto di tipo ResultSet
con l’istruzione
ResultSet res=pstmt.executeQuery();
e infine creiamo l’oggetto della classe UserBean con
while(res.next()){
userBean.setEmail(res.getString("email"));
userBean.setPassword(res.getString("password"));
}
il metodo next()
ci permette di scorrere i risultati (anche solo uno come in questo caso).
Se non ci sono risultati gli attributi dell’oggetto userBean saranno null, li controlliamo nella LoginServlet
LoginServlet.java
metodo dopost
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//doGet(request, response);
String email = request.getParameter("email");
String password = request.getParameter("password");
try {
UserBean userBean=DBManager.searchUser(email,password);
if(userBean.getEmail()==null) {
response.getWriter().append("Nessun utente con queste credenziali").append(request.getContextPath());
}else {
response.getWriter().append("Benvenuto,"+userBean.getEmail()).append(request.getContextPath());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
per prima cosa assegnamo a due stringhe email e password i parametri in arrivo dal form dopodiché eseguiamo la query con il metodo statico searchUser(email,password)
della classe DbManager
successivamente controlliamo che l’attributo email non sia null (non ha trovato utenti con quelle credenziali); Nel caso l’utente abbia inserito le corrette credenziali stampiamo un saluto.
Creazione della sessione
A questo punto possiamo implementare la sessione, modifichiamo la classe LoginServlet
nel seguente modo
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//doGet(request, response);
String email = request.getParameter("email");
String password = request.getParameter("password");
try {
UserBean userBean=DBManager.searchUser(email,password);
if(userBean.getEmail()==null) {
response.getWriter().append("Nessun utente con queste credenziali").append(request.getContextPath());
}else {
HttpSession session=request.getSession();
session.setAttribute("email",userBean.getEmail());
response.sendRedirect("home.jsp");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
con il metodo setAttribute("email",userBean.getEmail());
creiamo una copia chiave valore formata dalla chiave email e dal valore email dell’utente ed infine reindirizziamo alla pagina home.jsp
con l’istruzione response.sendRedirect("home.jsp");
Accesso alle pagine riservate agli utenti che hanno effettuato il login
Creiamo una nuova pagina jsp per gli utenti registrati home.jsp e per prima cosa controlliamo l’esistenza di un parametro della sessione, se non presente reindirizziamo alla pagina login.jsp se presente salutiamo il nostro utente che ha eseguito correttamente il login
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String email=null;
if(session.getAttribute("email") == null){
response.sendRedirect("login.jsp");
}else{
email=(String)session.getAttribute("email");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
<h3>Benvenuto <%=email %> </h3>
</body>
</html>
tra questi simboli <% … %> scriptlets possiamo scrivere nel linguaggio Java all’interno della pagina jsp mentre con questi <%= %> scriviamo espressioni che corrispondono ad un Response.write