I have written a filter that intercepts http calls and logs request parameters.
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException,
ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String uri = httpRequest.getRequestURI();
String queryString = httpRequest.getQueryString();
long startTime = System.currentTimeMillis();
if (shouldBeRedirected(uri)) {
String type = getType(uri);
String redirectUrl = Util.getURLBasedUponStabilityLevel(Constants.STABILITY_LEVEL);
((HttpServletResponse) response).sendRedirect(redirectUrl + type);
return;
}
filterChain.doFilter(httpRequest, httpResponse);
long endTime = System.currentTimeMillis();
Timestamp startTimestamp = Timestamp.getInstance(startTime);
StringBuilder logString = new StringBuilder();
logString.append("Request URL: ");
logString.append(uri);
logString.append(" Query String: ");
logString.append(queryString);
logString.append(" Session Id: ");
logString.append(httpRequest.getRequestedSessionId());
logString.append(" Took: ");
logString.append(endTime - startTime);
logString.append("milliseconds. ");
logString.append(" StartTime: ");
logString.append(startTimestamp);
if(httpRequest.getMethod().equals("POST")){
JSONObject postParameters = new JSONObject();
Map parameterMap = httpRequest.getParameterMap();
Iterator<Map.Entry<String, String[]>> it = parameterMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String[]> entry = it.next();
if(entry.getValue().length == 1){
postParameters.put(entry.getKey(), entry.getValue()[0].toString());}
else{
JSONArray valueList = new JSONArray();
for(String value : entry.getValue()){
valueList.add(value.toString());
}
postParameters.put(entry.getKey(), valueList);
}
}
logString.append(" Post Parameters: ");
logString.append(postParameters.toString());
}
LOG.info(logString.toString());
}
Code looks a bit clumsy to me, any suggestions to improve this?