Bom dia a todos!
Estou iniciando em JBoss Seam e me ocorreu uma duvida. Criei uma classe LogFilter que implementa a javax.servlet.Filter para que todo request e reponse fosse tratado como de meu interesse para logar a atividade do usuário. Até ai tudo ok.
O problema é que quando utilizo o request.getParameterMap() para pegar os values e keys de um método POST ele me retorna chaves como “j_id29:j_id34:j_id35” e as vezes os values corretos em caso de entrada de dados.
Bem o que eu desejo é montar a url a qual o usuário foi direcionado dado um post, do mesmo modo quando trabalhava num projeto Struts, eis um exemplo:
/testeGUI/private/orderViewEdit.do?order.id=2269242912&orderTypeId=9
Segue meu código do LogFilter.
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Startup;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import com.colt.ntqr.util.LogFilterConfig;
@Startup
@Scope(ScopeType.APPLICATION)
@Name("logFilter")
@BypassInterceptors
@org.jboss.seam.annotations.web.Filter(within="org.jboss.seam.web.ajax4jsfFilter")
public class LogFilter implements Filter {
private Log log;
private static FileWriter fileWriter;
private static File file;
private static Exception exception;
public void destroy() { }
public void init(FilterConfig filterConfig) throws ServletException {
log = LogFactory.getLog(this.getClass());
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
if (exception == null) {
try {
this.save(req);
} catch (Exception e) {
log.error("Start Audit logs failed.");
log.error(e, e);
exception = e;
}
}
chain.doFilter(request, response);
}
private synchronized void save(HttpServletRequest req) throws Exception {
Date date = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String logName = LogFilterConfig.getDefaultInstance().getProperty("fileNamePrefix") + sdf.format(date).toString() + ".log";
String path = LogFilterConfig.getDefaultInstance().getProperty("filesPath");
logName = URLEncoder.encode(logName, "UTF-8");
File folder = new File(path);
if (!folder.isDirectory()) {
folder.mkdirs();
}
if (file == null) {
file = new File(path + "/" + logName);
fileWriter = new FileWriter(file, true);
} else {
this.checkDate(path, logName);
}
StringBuilder reqString = new StringBuilder();
//Request Date
sdf.applyPattern("yyyy-MM-dd HH:mm:ss z");
reqString.append("[" + sdf.format(date).toString() + "]");
reqString.append("\t<user not logged>");
//Request Method
reqString.append("\t" + req.getMethod());
//Request URL
reqString.append("\t" + req.getRequestURI());
Enumeration teste = req.getParameterNames();
Map paramMap = req.getParameterMap();
Object[] keys = paramMap.keySet().toArray(new Object[paramMap.keySet().size()]);
//Request Parameter(s)
if (keys != null && keys.length > 0) {
reqString.append("?");
for (int i = 0; i < keys.length; i++) {
if (i > 0) {
reqString.append("&");
}
this.getParametersWithValues(reqString, (String) keys[i], (String[]) paramMap.get( keys[i]));
}
}
fileWriter.write(reqString.toString() + "\n");
fileWriter.flush();
}
Agradeço desde já atenção.