2015-01-06 2 views
0

JSP 폼을 사용하고 Servlet을 통해 HomePage를 표시하는 간단한 로그인 응용 프로그램을 만들었습니다. 서블릿 내에 몇 개의 사용자 이름과 암호를 저장하는 HashMap도 만들었습니다. 사용자가 사용자 이름과 암호를 입력하면 내부에있는 것과 비교됩니다. 지도와 적절한 메시지가 표시됩니다. 그러나 문제는 여기에 HashMap은 사용자가 로그인 버튼을 눌렀을 때 초기화됩니다. 즉, 서블릿 프로그램이 시작될 때입니다. 직접지도를 초기화하고 언제든지 사용자가지도와 비교하여 로그에 기록해야합니다. 대신 로그인을 한 후에지도를 초기화하는 대신 자리를 뜰 수 있습니다. 여기 는 지금까지서버 시작시 해시 맵을 초기화하는 방법은 무엇입니까?

의 login.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Login</title> 
    </head> 
    <body> 
    <center> 
    <b>LOGIN PAGE</b><br> 
    </center> 
    <form name="login" method="post" action="UserAuthentication"> 
    <center> 
    USER NAME: <input type="text" name="username"> 
    <br> 
    <br> 
    PASSWORD: <input type="password" name="password"> 
    <br> 
    <br> 
    <input type="submit" value="LOGIN"> 
    </center> 
    </form> 
    </body> 
    </html> 

이 UserAuthentication.java

public class UserAuthentication extends HttpServlet{ 

    public void doPost(HttpServletRequest request,HttpServletResponse response) 
    throws IOException{ 

    String username = request.getParameter("username"); 
    String password = request.getParameter("password"); 
    PrintWriter out = response.getWriter(); 


    Map<String,String>users = new HashMap<String,String>(); 
    users.put("Sheetal", "sss"); 
    users.put("Raj","rrr"); 
    users.put("Anjali", "aaa"); 
    users.put("Bhavya","bbb"); 

    if(users.containsKey(username) && users.containsValue(password)) 
    { 
     if(password.equals(users.get(username))) 
    { 
     out.println("<html>"+ 
        "<body>"+ 
        "Login Successful" + "<br>" + 
        "Welcome " + username + "<br>" + 
        "</body>" + 
        "</html>"); 
     } 
    } 
    else 
    { 
     out.println("<html>"+  
        "<body>"+ 
        "Login Unsuccessful" + "<br>" + 
        "Try again" + "<br>" + 
        "</body>" + 
        "</html>"); 
     } 
    } 

    } 

TIA

+0

.. – Prashant

답변

2

클래스의 정적 해시 맵을 확인 (나는 또한 가정했을 것입니다 그것의 최종) :

private static final Map<String,String> users = new HashMap<>(); 

그리고 정적 초기화 블록에 채 웁니다 : 클래스가 등록 될 때

static { 
    users.put("Sheetal", "sss"); 
    users.put("Raj", "rrr"); 
    users.put("Anjali", "aaa"); 
    users.put("Bhavya", "bbb"); 
} 

이 방법은의 HashMap이 채워집니다.

초기화 도구에 대해 잘 모르는 경우 article을 읽어보십시오.

+0

이 좋은 생각이지만, 흥미로운 일이 될 수있는 대안은있다 ['ContextListener'] (http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html) ContextListener 클래스를 지정하면 해당 클래스는 응용 프로그램이 배포되는 즉시 실행됩니다. [this] (https://gist.github.com/zack6849/9dad0f195da94bf15d4b)와 같은 것이 작동해야합니다. 이전 servlet 엔진 용 web.xml에서 리스너를 지정해야 할 수도 있습니다. – zack6849

0

가장 좋은 방법은 사용자라고하는 싱글 톤 클래스를 만드는 것입니다. 아래에 나와 있습니다.

public class Users{ 

private static Map<String,String> users = new HashMap<>(); 

private users(){ 
users.put("Sheetal", "sss"); 
users.put("Raj", "rrr"); 
users.put("Anjali", "aaa"); 
users.put("Bhavya", "bbb"); 
} 

public static Users singleInstance = new Users(); 

public boolean validate(String userName,String password) 
{ 
boolean result = false; 
if(condition) 
    result = true; 
return result; 
} 

하고 유효성 검사를 수행 할 때 UserAuthentication.java에서

,

if(Users.singleInstance.validate(userName,password)) 
정적 블록을 사용할 수 있습니다
관련 문제