Boa tarde a todos.
Recentemente tivemos a requisição de implementar uma Applet para Assinatura Digital, porém foi necessário implementar uma Servlet para capturar via Stream o todo o conteúdo que o servidor estará enviando, sendo o código abaixo:
Servlet: UploadFile.java
public class UploadFile extends HttpServlet {
private static final long serialVersionUID = -6854308881497499691L;
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
InputStream in;
StringBuffer paramsApplet = null;
try {
in = request.getInputStream();
paramsApplet=new StringBuffer();
int d;
while((d=in.read()) != -1){
paramsApplet.append((char)d);
}
String params = paramsApplet.toString();
////////////////////Obtendo o Map a partir dos parametros serializados////////////////////
//---------------------------Chaves do map----------------------------------------------//
// texto //
// assinatura //
// nomeArquivo //
// extensaoArquivo //
// moduloCertificador //
// projeto.id //
//////////////////////////////////////////////////////////////////////////////////////////
HashMap<String,String> paramsMap = this.getList(params);
/* O parametro texto contém o conteúdo codificado do pdf.
O método Base64.decode decodifica essa String e converte em um array de Bytes,
como a informação será persistida em banco o ideal é que vocês executem esse método
somente quando necessário pois se o array for convertido em String o arquivo criado
não estará integro.
Isso acontece pois o conteúdo de um pdf possui determinados bytes não baseados
no padrão UNICODE. Portanto não convertam para String!! Se vcs preferirem a String
deixem o conteúdo em base64 e utilizem o método descrito acima para decodificar.
*/
request.setAttribute("texto", paramsMap.get("texto"));
request.setAttribute("assinatura", paramsMap.get("assinatura"));
request.setAttribute("nomeArquivo", paramsMap.get("nomeArquivo"));
request.setAttribute("extensaoArquivo", paramsMap.get("extensaoArquivo"));
request.setAttribute("moduloCertificador", paramsMap.get("moduloCertificador"));
request.setAttribute("projeto.id", paramsMap.get("projeto.id"));
/*
System.out.println("texto " + texto );
System.out.println("nome " + nomeArquivo );
System.out.println("ext " + extensaoArquivo );
System.out.println("assinatura " + assinatura );
System.out.println("assinatura " + moduloCertificador );
System.out.println("assinatura " + projetoID );
*/
/////////////////////////WRITE OUTPUT//////////////////////////////////////
// O response é importante para Applet //
// Pois ele determina o sucesso da operação e desocupa o link //
/////////////////////////////////////////////////////////////////////////////
ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
//write to output stream
out.writeChars("Success!");
out.flush();
//close output stream
out.close();
//RequestDispatcher rd = request.getRequestDispatcher("/assinaturaDigital.assinarDocumento.logic");
//rd.forward(request, response);
ServletContext context = this.getServletContext();
RequestDispatcher rd = context.getRequestDispatcher("/assinaturaDigital.assinarDocumento.logic");
rd.include(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
private HashMap<String,String> getList(String param){
HashMap<String, String> params = new HashMap<String,String>();
String[] array = param.split("&");
for(String s : array){
String[] p = s.split("=");
try {
params.put(p[0], URLDecoder.decode(p[1], "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return params;
}
}
O Código acima esta sendo executado a contento, porém na parte em que preciso chamar uma lógica (vraptor) este não esta ocorrendo, sendo:
ServletContext context = this.getServletContext();
RequestDispatcher rd = context.getRequestDispatcher("/assinaturaDigital.assinarDocumento.logic");
rd.include(request, response);
Utilizo VRator 2.6.0 + Picocontainer 2.14.1 + Hibernate 4.2.1
Minha classe de negócio esta assim,
Classe: AssinaturaDigitalAjax.java
@Component("assinaturadigital")
@InterceptedBy({ DaoInterceptor.class, LoginInterceptor.class, DownloadInterceptor.class })
public class AssinaturaDigitalAjax {
private DaoFactory daoFactory;
private Usuario usuarioConectado;
private HttpSession httpSession;
private ClientOutput clientOutput;
...
...
...
public AssinaturaDigitalAjax(DaoFactory daoFactory, Usuario usuarioConectado, ClientOutput clientOutput, HttpSession httpSession) {
this.daoFactory = daoFactory;
this.usuarioConectado = usuarioConectado;
this.httpSession = httpSession;
this.clientOutput = clientOutput;
}
...
...
...
@Remotable
@Logic(parameters = { "projeto", "moduloCertificador", "texto", "nomeArquivo", "extensaoArquivo", "assinatura" })
public void assinarDocumento(Projeto projeto, String moduloCertificador, String texto, String nomeArquivo, String extensaoArquivo, String assinatura) throws IOException {
if (!texto.trim().equals("") && !assinatura.trim().equals("")) {
...
...
...
} else
throw new RuntimeException("Arquivo sem assinatura digital.");
}
Qualquer direcionamento será muito bem vindo…