Session in Java

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

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

La mia repository GitHub della lezione

Pubblicato da Carlo Contardi

Carlo Contardi, docente di informatica e sviluppatore Full Stack, condivide la sua passione per la programmazione e l’informatica attraverso il suo blog Space Coding. Offre preziosi consigli e soluzioni pratiche a chi vuole imparare a programmare o migliorare le proprie abilità. 🚀👨‍💻

Translate »