package javacodebook.server.login; import javax.servlet.*; import javax.servlet.http.*; /** * Eine abstrakte Klasse, die überprüft, ob der Benutzer angemeldet * ist. Davon abgeleitete Servlets führen automatisch diese Überprüfung * durch. Sie müssen die Methode handleRequest() überschreiben, um eigene * Aktionen auszuführen. */ public abstract class LoginController extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { User user = (User)req.getSession().getAttribute("user"); //hier wird der Name des aufgerufenen Servlets gespeichert, um nach //erfolgreicher Anmeldung dahin leiten zu können String calledServlet = req.getServletPath().substring(1, req.getServletPath().length());//führender "/" weg req.setAttribute("called_servlet", calledServlet); //Login und Passwort überprüfen, wenn korrekt, Benutzer einloggen if("true".equals(req.getParameter("perform_login"))) { String login = req.getParameter("login"); String passwd = req.getParameter("passwd"); String passwdRep = req.getParameter("passwd_rep"); if(!passwd.equals(passwdRep)) showLogin(req, res); else { user = User.findUser(login, passwd); if(user == null) showLogin(req, res); else { req.getSession().setAttribute("user", user); handleRequest(req, res); } } } //Logout durchführen, d.h. das Attribut "user" wird wieder aus der //Session entfernt else if("true".equals(req.getParameter("perform_logout"))) { req.getSession().removeAttribute("user"); showLogin(req, res); } //noch kein Benutzer eingeloggt -> Formular anzeigen else if(user == null) { showLogin(req, res); } //Benutzer ist bereits eingeloggt, jetzt wird die handleRequest()-Methode //der entsprechenden Unterklasse ausgeführt else { handleRequest(req, res); } } protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { doGet(req, res); } /* * Diese Methode wird von Servlet-Unterklassen implementiert, die eine * Zugangskontrolle benötigen. */ protected abstract void handleRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException; //Bequemlichkeitsmethode für die Anzeige der Login-Seite private void showLogin(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { req.getRequestDispatcher("login.jsp").forward(req, res); } } --- Neue Klasse --- package javacodebook.server.login; import javax.servlet.*; import javax.servlet.http.*; public class ShowUser extends LoginController { /* * Hier wird die Methode handleRequest implementiert, um die konkrete Funktion * dieses Servlets umzusetzen. */ protected void handleRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { req.getRequestDispatcher("show_user.jsp").forward(req, res); } } --- Neue Klasse --- package javacodebook.server.login; import java.sql.*; /** * Die Klasse User kapselt die Benutzerdaten und die Abfrage der Login-Daten * aus einer Datenbank. Ein Benutzer hat die Daten ID, Login-Name, Name, * Passwort und Email. Das Passwort kann von aussen nicht ermittelt werden, um * keine Sicherheitslücke zu erzeugen. */ public class User { private String id; private String loginName; private String name; private String email; //der Konstruktor für User ist privat, da die Klasse selbst kontrolliert, //wie der Zugriff auf die Benutzertabelle erfolgt. private User(String id, String loginName, String name, String email) { this.id = id; this.loginName = loginName; this.name = name; this.email = email; } //Hier wird anhand des Login-Namens und des Passworts nach einem //entsprechenden Benutzer gesucht. Wird keiner gefunden, so wird null //zrückgegeben. Login-Namen müssen eindeutig sein, daher kann kein //mehrfaches Ergebnis gefunden werden. public static User findUser(String loginName, String passwd) { User user = null; Connection conn = null; PreparedStatement stmt = null; try { //JDBC-Treiber laden Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:dirk", "book", "book"); //Abfrage von Login und Passwort in der Datenbank String sql = "select * from user_table where user_login = ? " + " and user_passwd = ?"; stmt = conn.prepareStatement(sql); stmt.setString(1, loginName); stmt.setString(2, passwd); ResultSet rs = stmt.executeQuery(); if (rs.next()) { user = new User(rs.getString("user_id"), rs.getString("user_login"), rs.getString("user_name"), rs.getString("user_email")); } rs.close(); } catch(Exception e) { e.printStackTrace(System.out); } finally { //Connection und PreparedStatement müss auf jeden Fall geschlossen //werden, um belegte Ressourcen wieder freizugeben. try { stmt.close(); } catch(Exception ignored) {} try { conn.close(); } catch(Exception ignored) {} } return user; } public String getId() { return id; } public String getLoginName() { return loginName; } public String getName() { return name; } public String getEmail() { return email; } } --- login.jsp --- <%@page contentType="text/html"%>
Name: | <%= user.getName() %> |
<%= user.getEmail() %> |