2016-06-16 6 views
0

Ich habe ein Servlet entwickelt, um Benutzer basierend auf ihrem Client-Zertifikat zu authentifizieren. Allerdings habe ich einen Fehler gemacht, indem ich einige Variablen in die Klassendefinition eingefügt habe, damit sie zwischen den Sitzungen geteilt werden. Ich hätte sie in die doGet-Methode platzieren sollen.Servlet - Empfohlene Vorgehensweise für den Variablenbereich für die DataSource-Verbindung

Jetzt möchte ich einen Rat über DataSource Best Practice erhalten. Ich deklariere den InitialContext und die Datenquelle in der Klasse und initiere sie in der init-Methode. Ich deklariere die Verbindung innerhalb der doGet, wo ich die ds.getConnection mache. Ist mein folgender Code korrekt?

Vielen Dank im Voraus.

public class readclientcertificate extends HttpServlet { 

    private static final String CONTENT_TYPE = "text/html; charset=windows-1252"; 
    // moved in doGet private X509Certificate cert; 
    // moved in doGet private String strUUID = ""; 
    // moved in doGet private String strFormsURL = ""; 
    private InitialContext ic; 
    private DataSource ds = null;  

    public void init(ServletConfig config) throws ServletException, NamingException { 
     super.init(config); 
     ic = new InitialContext(); 
     ds = (DataSource)ic.lookup("jdbc/OracleCoreDS");   
    } 

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

     response.setContentType(CONTENT_TYPE); 
     PrintWriter out = response.getWriter();    
     X509Certificate cert = null; 
     String strUUID = ""; 
     String strFormsURL = "";   
     Connection conn = null; 
     // Retreive Certificate 
     try{   
      X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate"); 
      cert = certs[0];      
     } catch(Exception e){ 
      out.println(e.getMessage()); 
     } 

     // Connect to DB and Insert Certificate Informations. 
     if (cert != null) { 
      try { 

       conn = ds.getConnection();   
       Statement stmt = conn.createStatement(); 
       ResultSet rs = stmt.executeQuery("select K$LOGON.FA_ADD_CERTIFICATE('" + cert.getSerialNumber() + "','" + cert.getSubjectDN() + "','" + request.getRemoteAddr() + "','" + request.getRemoteHost() + "','" + request.getRequestURL() + "','" +strFormsURL + "') from dual"); 
       while (rs.next()) { 
       strUUID = rs.getString(1); 
       } 
       conn.close(); 

      } catch (SQLException se) { 
       throw new ServletException(se); 
      } catch (NamingException ne) { 
       throw new ServletException(ne); 
      }  
     } 

Antwort

0

Es ist in Ordnung, die Datenquelle wird von dem Anwendungsserver behandelt. Es gibt also nur eine Instanz der Datenquelle für einen Jndi-Schlüssel, Sie können die Datenquelleninstanz teilen ... NICHT die Verbindungsinstanz