大家好! 感谢进来帮我解决问题!问题陈述:
   我在使用CA认证遇上一个问题, 由于CA认证的时候要和CA服务器有一个交互.
而且CA服务器限定WEB程序的客户端不能直接和CA服务器交互, 只能有WEB服务端进行交互.所以CA发出验证信息必须通过web服务器做一个中转.
   在WEB客户端发出验证的时候(通过访问CA服务器的一个地址, 比如说 http://aaa:8080/a.asp), 我是在WEB服务器段做了一个转发的请求(也就是把http://aaa:8080/a.asp先通过web服务器, 在有web服务器转发出去, 具体看后面的代码), 但是客户端发出请求的时候是带有参数的, 我通过我的方法导致CA服务器那边的参数获取不到.
  请大家指点;代码:
就是把原来请求CA服务器的连接先指向WEB服务器的一个连接/**
 * 处理ceb验证跳转
 * pack, unpack, stamp, print
 * @param pMapping
 * @param pForm
 * @param pRequest
 * @param pResponse
 * @return
 * @throws OAException
 */
public ActionForward dealValidateForward(ActionMapping pMapping,
ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse) throws OAException{
String operValidate = pRequest.getParameter("operValidate");
String cebServerPath = CEBValidateConstant.property.getProperty("cebServerPath");
String validatePage = "";
boolean doOutput = true; //是否需要印章服务器返回数据
if(operValidate.equals("packValidate")){
validatePage = cebServerPath + CEBValidateConstant.property.getProperty("packValidateURL");
}else if(operValidate.equals("unPackValidate")){
validatePage = cebServerPath + CEBValidateConstant.property.getProperty("unpackValidateURL");
}else if(operValidate.equals("stampValidate")){
validatePage = cebServerPath + CEBValidateConstant.property.getProperty("stampValidateURL");
}else{
validatePage = cebServerPath + CEBValidateConstant.property.getProperty("printValidateURL");
}
try {
CEBValidateConstant.invokeRemote(validatePage, doOutput, pRequest,
pResponse);
} catch (Exception e) {
e.getMessage();
throw new OAException("印章校验出错!");
}
return null;
}下面的方法是转发数据包, 和获取返回的数据
/**
 * 访问印章服务器
 * @param url 要访问的地址
 * @param doOutput 是否需要印章服务器返回信息
 * @param request HttpServletRequest请求包
 * @param response HttpServletResponse响应包
 * @return string 被访问的服务器的返回信息
 * @throws IOException 如果连接印章服务器失败则抛出IOException
 * @throws MalformedURLException 
 */
public static String invokeRemote(String url,boolean doOutput,HttpServletRequest request,HttpServletResponse response) throws IOException,MalformedURLException{
String retVal = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream(); URL server = new URL(url);
HttpURLConnection conn = (HttpURLConnection)server.openConnection();

conn.setDoOutput(doOutput);
conn.setDoInput(true);
conn.setUseCaches(false);
//weicd
conn.setRequestMethod("POST");
conn.setRequestProperty("Cache-Control","no-cache");

DataInputStream in = null;

if(doOutput){//需要接收客户端数据包
//读取包
in = new DataInputStream(new BufferedInputStream(request.getInputStream()));

int ch = in.read();
while(ch!=-1){
baos.write(ch);
ch = in.read();
}
in.close();
//System.out.println(baos.toString());
byte[] content = baos.toByteArray();
baos.close();

//转发数据包
DataOutputStream outToStampServer = new DataOutputStream(new BufferedOutputStream(conn.getOutputStream()));

outToStampServer.write(content);
outToStampServer.flush();
outToStampServer.close();

int response_code = conn.getResponseCode();

System.out.println("response_code" + response_code);
System.out.println("conn.getResponseMessage()" + conn.getResponseMessage());
System.out.println("conn.getContentLength()" + conn.getContentLength());
System.out.println("conn.getContentType()" + conn.getContentType()); /*log("CebSeal.java 272 response code:"+response_code);
log("CebSeal.java 273 response message:"+conn.getResponseMessage());

log("CebSeal.java 274 response Length:"+conn.getContentLength());
log("CebSeal.java 275 response contentType:"+conn.getContentType());*/

}

//读取公章服务器的执行结果
in = new DataInputStream(new BufferedInputStream(conn.getInputStream())); int ch = -1;
ch = in.read();

while(ch!=-1){
baos.write(ch);
ch = in.read();
}

in.close();

byte[] content = baos.toByteArray();
baos.close();
retVal = new String(content);
System.out.println("返回值:" + retVal);
if(doOutput){
DataOutputStream outToClient = new DataOutputStream(response.getOutputStream());

outToClient.write(content);
}

conn.disconnect();

return retVal;
/*String createID = request.getParameter("CreateID");
String issueID = request.getParameter("IssueID");
request.getAttributeNames();
Map reqMap = request.getParameterMap();
String paramIn = "";
for (Iterator iter = reqMap.keySet().iterator(); iter.hasNext();) {
String param = (String) iter.next();
String paramStr = param + "="
+ ((String[]) reqMap.get(param))[0];
paramIn = paramIn + paramStr + "&";
}

String s1=sendPost(url,paramIn);
return s1;*/
}//invokeRemote()问题就是通过这种方式, 导致CA服务器那边有的参数获取不到, 但是客户端直接连CA服务器验证是好的, 请大家帮帮忙....