Home / Programmazione / Java / Gestire le sessioni con le Servlet
Mattepuffo

Gestire le sessioni con le Servlet

Gestire le sessioni con le Servlet

Gestire le sessioni con le Servlet è abbastanza semplice.

Prendiamo uno scenario del genere:

-form di login

-se l'utente esiste viene creato un oggetto User

-l'oggetto viene passato alla Servlet che crea una sessione

Quindi partendo da un form del genere:

<table>
<form action="ServletLogin" method="post">
<tbody>
<tr>
<td>User:</td>
<td><input type="text" id="focus" name="username" value="" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" value="" /></td>
</tr>
<tr>
<td><input type="submit" value="Submit" name="submit" /></td>
</tr>
</form>
</table>

Questo form richiama la ServletLogin in POST:

public class ServletLogin extends HttpServlet {

private DBManager db = DBManager.getInstance(); // CLASSE PER LA CONNESSIONE

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean success = false;
HttpSession session = request.getSession(true);
if (session.getAttribute("user") == null) {
try {
User user = db.login(request.getParameter("username").trim(), request.getParameter("password").trim());
String userCreato = user.getName().toString();
int userCreatoId = user.getId();
session.setAttribute("user_id", userCreatoId);
session.setAttribute("user_name", userCreato);
success = true;
if (success) {
response.sendRedirect("index.jsp");
} else {
response.sendRedirect("error.jsp?err=Atenticazione fallita");
}
} catch (ClassNotFoundException ex) {
response.sendRedirect("error.jsp?err=" + ex.getMessage());
} catch (SQLException ex) {
response.sendRedirect("error.jsp?err=" + ex.getMessage());
} catch (NoSuchAlgorithmException ex) {
response.sendRedirect("error.jsp?err=" + ex.getMessage());
}
}
}

}

Istanzia un oggetto HttpSession con il quale prendiamo la sessione corrente.

 

Di questa sessione prendiamo l'attributo user con session.getAttribute("user").

Se l'attributo non esiste allora creiamo un oggetto User usando un metodo che interroga il db:

public User login(String name, String pwd) throws ClassNotFoundException, SQLException, NoSuchAlgorithmException, UnsupportedEncodingException {
User user = new User();
conn = DBManager.getInstance().takeConnection();
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] encodeName = md.digest(name.getBytes("UTF-8"));
byte[] encodePwd = md.digest(pwd.getBytes("UTF-8"));
String convName = ConvertHexToString.convert(encodeName);
String convPwd = ConvertHexToString.convert(encodePwd);
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM user WHERE user_name = ? AND user_pass = ?");
pstmt.setString(1, convName);
pstmt.setString(2, convPwd);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
user.setId(rs.getInt("user_id"));
user.setName(name);
user.setPwd(pwd);
rs.close();
pstmt.close();
} else {
user.setId(0);
user.setName("");
user.setPwd("");
rs.close();
pstmt.close();
}
return user;
}

Questo metodo mi ritorna appunto un oggetto User che viene riempito con i relativi dati presi da db nel caso in cui la query sia andata a buon fine.

In tal caso possiamo creare vari attributi session.setAttribute(...,...), che richiede due parametri.

L'oggetto User è un semplice Bean:

public class User {

private int id;
private String name;
private String pwd;

public User() {
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}
}

Non vi sto a spiegare tutto il meccanismo di connessione al db e il metodo login() in quanto ognuno ha i suoi metodi di connessione.

Inoltre ne ho anche parlato più volte.

Comunque questo potrebbe essere un esempio di login.

Ricapitolando attravero il metodo login() creiamo e valoriziamo un oggetto User e poi usiamo i suoi valori per creare degli attributi nella sessione.