Pessoal,
Como faço para deixar que o usuário se logue uma vez por sessão em uma aplicação web? Sei que tenho que usar o synchronized, mas não sei como. Segue meu servlet de autenticação e gravação no session:
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException,IOException{
String userId = req.getParameter("userId");
String password = req.getParameter("password");
try {
Class.forName("org.postgresql.Driver");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
Connection con = null;
ResultSet rs = null;
con = DriverManager.getConnection("jdbc:postgresql://localhost/sistema", "usuario", "senha");
/* pega dados do usuário */
String sql = "SELECT id,login,nome,senha,level,ativo FROM usuarios WHERE login LIKE '"+ userId +"' AND senha LIKE '"+ password +"' AND ativo='1'";
Statement s = con.createStatement();
rs = s.executeQuery(sql);
if (rs.next()) {
HttpSession userSession = req.getSession(true);
try{
String nivel = rs.getString("level");
String id_usuario = rs.getString("id");
String nome_usuario = rs.getString("nome");
int ativo = rs.getInt("ativo");
userSession.putValue("nome_usuario", nome_usuario);
userSession.putValue("nivel", nivel);
userSession.putValue("id_usuario", id_usuario);
userSession.putValue("usuario", userId);
userSession.putValue("userName", "1");
}catch(SQLException e){
System.out.println(e);
}
RequestDispatcher rd = getServletContext().getRequestDispatcher("/home.jsp");
RequestDispatcher rdinativo = getServletContext().getRequestDispatcher("/erroInativo.jsp");
if (rd != null){
rd.forward(req,res);
}
}else{
RequestDispatcher rd2 = getServletContext().getRequestDispatcher("/erroLogin.jsp");
rd2.forward(req,res);
}
rs.close();
s.close();
con.close();
} catch (SQLException e){
e.printStackTrace();
}
Ou seja, eu quero que se o usuário tentar logar em outro micro e o session ainda estiver ativo, ele não deixe.

