我开发了一个servlet来根据客户端证书对用户进行身份验证。 但是,我在类定义中放置了一些变量,因此它们在会话之间共享,从而犯了一个错误。 我应该将它们放入doGet方法中。
现在,我想获得有关DataSource最佳实践的建议。 我在类中声明了InitialContext和Datasource,并在init方法中初始化它们。 我在doGet中声明了Connection,我在那里执行ds.getConnection。 我的以下代码是否正确?
提前致谢。
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 :(得分:0)
没关系,数据源由应用服务器处理。所以jndi键只有一个数据源实例,你可以共享数据源实例......不是连接实例