在数据库中存储有证书和由证书解析出来的主题。但是在程序运行一段时间之后,发现不能兼容某些特别格式的证书。所以就修改了证书的验证方式。但是对于已经存储在数据库中的数据,就需要我们手动提取出证书,然后按照新的解析方式解析出主题后,再将其存储在数据库中。
然而因为这是已经上线正在使用的系统,而实施人员又不懂逻辑。写成一个java类,手动调用太麻烦,所以就考虑将这些逻辑全部写在jsp中,然后直接访问一下这个jsp页面,就会自动调用这些代码执行。
jsp开头文件是:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
引入单个包:
<%@ page import="java.sql.*" %>
引入多个包:与单个包一样,只是用都好隔开就好
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
或是单独一次import一个包也可:
<%@page import="java.util.Date"%>
<%@page import="java.text.DateFormat"%>
以下是页面操作的完整代码:
<%@page import="java.sql.*" %>
<%@page import="java.util.Date"%>
<%@page import="java.text.DateFormat"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="com.koal.cas.util.CertUtil"%>
<%@page import="com.koal.cas.util.x509.CommonCertificate"%>
<%@page import="com.koal.cas.cert.CertFormat"%>
<%@page import="com.koal.cas.entity.table.EntityCA"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
boolean allUpdateResult = true;
Connection conn = null;
//用于查询
Statement stmtQuery = null;
//用于修改,查询和修改不要混用一个Statement。
Statement stmtUpdate = null;
ResultSet rs = null;
try{
Class.forName("com.kingbase.Driver").newInstance();
//首先修改这里的url,user,password
String url = "jdbc:kingbase://127.0.0.1:54321/ksso_prt";
String user = "SYSTEM";
String password = "krms";
conn = DriverManager.getConnection(url, user, password);
EntityCA ca = new EntityCA();
stmtQuery = conn.createStatement();
stmtUpdate = conn.createStatement();
rs = stmtQuery.executeQuery("select * from TB_CA");
while(rs.next()){
//rs的索引是从 1 开始的,而非我们一般的从 0 开始
String cert = rs.getString(4);
//解析出证书的主题,调用的是java类
String derCert=CertFormat.unFormatCert(cert);
CommonCertificate commonCert = CertUtil.getX509Cert(derCert);
String subject=commonCert.getSubject();
//因为Statement是与ResultSet绑定的。如果在这里还用stmtQuery的话,就会导致 rs 重置为空,就不能在循环读取之后的数据了,所以在嵌套的时候,查询和修改要用两个Statement
int result = stmtUpdate.executeUpdate("update TB_CA set CA_CERT_SUBJECT='" + subject + "' where CA_CERT = '" + cert + "'");
if(result < 1){
allUpdateResult = false;
}
}
}finally{
//可能这种关闭方法大家都会嫌太麻烦,只是在正式商用的系统中,为了绝对的安全可靠而言,又是写法麻烦些也是必要的,一切以稳妥为最高目标
try{
if(rs != null)
rs.close();
}catch(Exception e){ }
try{
if(stmtQuery != null)
stmtQuery.close();
}catch(Exception e){ }
try{
if(stmtUpdate != null)
stmtUpdate.close();
}catch(Exception e){ }
try{
if(conn != null)
conn.close();
}catch(Exception e){ }
}
//在网页显示一条信息,以表示执行结果
if(allUpdateResult){
out.println("所有CA主题项修改成功!<br/>");
}else{
out.println("CA信息修改失败!<br/>");
}
out.println("执行结束!");
%>
执行这个页面的代码方式是:访问一下该页面即可,即在浏览器中输入 http://localhost:8080/test/update.jsp 即可。