Comment suivre les tentatives de connexion à l'aide de HttpSession en Java?

J'ai un no-cadre de l'application web. J'ai besoin de mettre en œuvre un moyen simple pour vérifier échec des connexions, à l'aide de sessions. Si l'utilisateur tente de se connecter 3 fois à l'aide incorrecte nom d'utilisateur/mot de passe, ils seront donnés à 20 minutes délai d'attente avant de pouvoir vous connecter à nouveau.

Actuellement j'ai seulement mis une session utilisateur si l'utilisateur se connecte avec succès dans le système. Cependant, il semble que je devrais obtenir une session en cas d'échec de la connexion aussi, et de compter les tentatives de connexion en quelque sorte.

De connexion.jsp (version simplifiée):

<form name="loginForm" method="post" action="CustomerData">
User name:<input type="text" name="userName"/>
Password:<input type="password" name="password"/>
<input type="button" value="submit">

CustomerData.java (version simplifiée):

//See if customer is a valid user
        String selectQuery = "Select firstName,lastName,email from customer where userName='"+userName+"' and password='"+password+"'";
        selectResult = statement.executeQuery(selectQuery);

if(selectResult.next())
{
    //We got a valid user, let's log them in
    ....
    HttpSession session = request.getSession(true);
    session.setAttribute("customer", customer);
}
else
{
    //this is where I need to get the session id (??),
    //count the unsuccessful login attempts somehow, 
    //and give them a 20 minutes timeout before they can try logging in again.

    request.setAttribute("message","Invalid username or password. Please try again!");

}

En faisant des recherches, j'ai trouvé qu'il y a beaucoup de fonctions de sécurité intégrées pour diverses Java cadres. J'ai aussi trouvé que l'utilisation de sessions n'est pas la meilleure façon de suivre les tentatives de connexion, car l'utilisateur peut se connecter avec les différents navigateurs. Cependant, je suis à la création de cette fonctionnalité pour un projet web simple qui ne sera jamais à aller à n'importe quel environnement de production. Je voudrais savoir comment mettre en place cette fonctionnalité à l'aide de Java Objet HTTPSession.

Ok, voici ma solution complète, basée sur les commentaires que j'ai reçu. Je poste dans ce cas, il peut aider d'autres personnes avec des problèmes similaires:

//See if customer is a valid user
String selectQuery = "Select firstName,lastName,email from customer where userName='"+userName+"' and password='"+password+"'";
selectResult = statement.executeQuery(selectQuery);
if(selectResult.next())
{
//We got a valid user, let's log them in
Customer customer = new Customer();
customer.setFirstName(selectResult.getString("firstName"));
customer.setLastName(selectResult.getString("lastName"));
customer.setEmail(selectResult.getString("email"));
customer.setUserName(userName);
customer.setPassword(password);
//establish a user session
session.setAttribute("customer", customer);
session.setAttribute("firstName", customer.getFristName());
url = "/index.jsp";
selectResult.close();
}
else
{
int loginAttempt;
if (session.getAttribute("loginCount") == null)
{
session.setAttribute("loginCount", 0);
loginAttempt = 0;
}
else
{
loginAttempt = (Integer) session.getAttribute("loginCount");
}
//this is 3 attempt counting from 0,1,2
if (loginAttempt >= 2 )
{        
long lastAccessedTime = session.getLastAccessedTime();
date = new Date();
long currentTime = date.getTime();
long timeDiff = currentTime - lastAccessedTime;
//20 minutes in milliseconds  
if (timeDiff >= 1200000)
{
//invalidate user session, so they can try again
session.invalidate();
}
else
{
//Error message 
session.setAttribute("message","You have exceeded the 3 failed login attempt. Please try loggin in in 20 minutes, or call our customer service center at 1-800 555-1212.");
}  
}
else
{
loginAttempt++;
int allowLogin = 3-loginAttempt;
session.setAttribute("message","loginAttempt= "+loginAttempt+". Invalid username or password. You have "+allowLogin+" attempts remaining. Please try again! <br>Not a registered cusomer? Please <a href=\"register.jsp\">register</a>!");
}
session.setAttribute("loginCount",loginAttempt);
url = "/login.jsp";
}
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
dispatcher.forward(request, response);
Je vous remercie pour votre aide, l'édition, Bhavik. Je suis encore nouveau ici, l'apprentissage du système.

OriginalL'auteur Marta | 2012-12-04