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