2013-12-07 6 views
1

Я только начал играть с сервлетами и попытался реализовать простую систему аутентификации на основе Java. У меня есть форма входа в систему, через которую вы отправляете данные для входа, и если она правильно перенаправляется на домашнюю страницу. Форма Войти, как в коде ниже:HTTP Status 404 - Запрошенный ресурс недоступен. Простая система проверки сервлетов

<form name="frmLogin" action="/LogonServlet" method="POST"> 
    <table border="1"> 
     <tr> 
      <td colspan="2"><c:out value="${errorMsg}"/> </td></tr> 
     <tr> 
      <td>User Name: </td> 
      <td><input type="text" name="username" /></td></tr> 
     <tr> 
      <td>Password: </td> 
      <td><input type="password" name="password" /></td></tr> 
     <tr> 
      <td><input type="submit" name="Submit" value="Submit"/></td></tr> 
    </table> 
</form> 

структура каталогов:

enter image description here

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>TestProject</display-name> 
    <servlet> 
     <display-name>LogonServlet</display-name> 
     <servlet-name>LogonServlet</servlet-name> 
     <servlet-class>test.cc.project.LogonServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>LogonServlet</servlet-name> 
     <url-pattern>/LogonServlet</url-pattern> 
    </servlet-mapping> 
</web-app> 

результат является:

HTTP Status 404 - /LogonServlet 

type Status report 
message /LogonServlet 
description The requested resource is not available. 

Может ли кто-нибудь объяснить мне, где я должен поставить класс, чтобы правильно его назвать? Благодарю.

UPDATE:

LogonServlet.java

@WebServlet("/LogonServlet") 
public class LogonServlet extends HttpServlet { 
    private static final String DB_URL = "jdbc:mysql://localhost:3306/test"; 
private static final String DB_USERNAME = "test"; 
private static final String DB_PASSWORD = "test"; 
private static final String LOGIN_QUERY = "SELECT * FROM `accounts` WHERE uname=? AND passwd=?"; 

private static final String HOME_PAGE = "../Home.jsp"; 
private static final String LOGIN_PAGE = "../Login.jsp"; 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String strUserName = request.getParameter("username"); 
    String strPassword = request.getParameter("password"); 
    String strErrMsg = null; 
    HttpSession session = request.getSession(); 
    boolean isValidLogon = false; 

    try { 
     isValidLogon = authenticateLogin(strUserName, strPassword); 
     if(isValidLogon) { 
      session.setAttribute("username", strUserName); 
     } else { 
      strErrMsg = "Username or Password is invalid. Please try again."; 
     } 
    } catch(Exception e) { 
     strErrMsg = "Unable to validate user/password in database"; 
    } 

    if(isValidLogon) { 
     response.sendRedirect(HOME_PAGE); 
    } else { 
     session.setAttribute("errorMsg", strErrMsg); 
     response.sendRedirect(LOGIN_PAGE); 
    } 

} 

private boolean authenticateLogin(String strUserName, String strPassword) throws Exception { 
    boolean isValid = false; 
    Connection conn = null; 

    try { 
     conn = getConnection(); 
     PreparedStatement prepStmt = conn.prepareStatement(LOGIN_QUERY); 
     prepStmt.setString(1, strUserName); 
     prepStmt.setString(2, strPassword); 
     ResultSet rs = prepStmt.executeQuery(); 
     if(rs.next()) { 
      System.out.println("User login is valid in DB"); 
      isValid = true; 
     } 
    } catch(Exception e) { 
     System.out.println("validateLogon: Error while validating password: " +e.getMessage()); 
     throw e; 
    } finally { 
     closeConnection(conn); 
    } 

    return isValid; 
} 

private Connection getConnection() throws Exception { 
    Connection conn = null; 

    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); 
     if (conn != null) { 
      System.out.println("Connected to the database"); 
     } 
    } catch(SQLException sqle) { 
     System.out.println("SQLException: Unable to open connection to DB: " +sqle.getMessage()); 
     throw sqle; 
    } catch(Exception e) { 
     System.out.println("Exception: Unable to open connection to DB: " +e.getMessage()); 
     throw e; 
    } 

    return conn; 
} 

private void closeConnection(Connection conn) { 
    try { 
     if(conn!=null && !conn.isClosed()) { 
      conn.close(); 
     } 
    } catch(SQLException sqle) { 
     System.out.println("Error while closing connection."); 
    } 
} 

} 
+0

Try 'действие = «LogonServlet» '(нет косой черты), потому что я предполагаю, что webapp не может быть развернут в '/' на сервере, а сервлет относительно JSP, который имеет форму на нем, - посмотрите URL-адрес в браузере. – jCoder

+0

@jCoder Благодарим вас за ответ, следуя вашему предложению, встретившему меня с ошибкой «HTTP-статус 500 - Ошибка создания экземпляра сервлета». Есть идеи? – Dozent

+0

Показать код сервлета. –

ответ

3
  1. вы звоните/LogonServlet, то вы перенаправлять ../Home.jsp и ../Login.jsp
  2. удалите «/» из web.xml
  3. удалите строку «@WebServlet («/LogonServlet »)», которая дублирует определение в отношении web.xml

наконец позвольте мне предложить не использовать собственный логин, используйте Realm и модуль аутентификации JEE это легче и более портативными

+0

спасибо за предложение, проблема была в точках '../Home.jsp и ../ Login.jsp'. Использование аутентификации Realm и JEE Я отметил для своего будущего опыта. Ответ принят. – Dozent

Смежные вопросы