2016-06-16 11 views
0

クライアント証明書に基づいてユーザーを認証するサーブレットを開発しました。 しかし、私はいくつかの変数をクラス定義に入れて間違えたので、セッション間で共有されています。 私はそれらをdoGetメソッドに配置する必要がありました。サーブレット - データソース接続の変数範囲のベストプラクティス

DataSourceのベストプラクティスについてアドバイスを受けたいと思います。 InitialContextとDatasourceをクラスに宣言し、initメソッドで初期化します。 ds.getConnectionを実行するdoGet内にConnectionを宣言します。 私の次のコードは正しいですか?

ありがとうございます。

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); 
      }  
     } 

答えて

0

データソースはアプリケーションサーバーによって処理されます。したがって、jndiキーのデータソースのインスタンスは1つだけです。データソースインスタンスを共有できます。接続インスタンスではありません。