/**
*
*/
package org.googlecode.perftrace.filter;
import java.io.IOException;
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.googlecode.perftrace.PerfTrace;
import org.googlecode.perftrace.filter.commons.codec.binary.Base64;
import org.googlecode.perftrace.perf4j.LoggingStopWatch;
/**
*
* modified by zhongfeng,添加性能监控
*/
public abstract class PerftraceFilter implements Filter {
public static final String ROOT_TOTAL_WATCH = "RootTotalWatch";
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
getPerftrace().addAdditionMsg(request.getRemoteAddr());
getPerftrace().addAdditionMsg(getChannel((HttpServletRequest)request));
getPerftrace().addAdditionMsg(getHttpBasicAuthUserName((HttpServletRequest) request));
//调用计时日志服务
LoggingStopWatch watch = createLoggingStopWatch();
try{
chain.doFilter(request, response);
}finally{
watch.stop();
}
}
/**
* @return LoggingStopWatch的子类有JavaLog Slf4j Log4j
*/
protected abstract LoggingStopWatch createLoggingStopWatch();
/**
* @return 返回Perftrace子类,支持的类型有JavaLog Slf4j Log4j
*/
protected abstract PerfTrace getPerftrace();
/**
* OTA验证及权限部分是基于context之后的部分做的
* 此方法用于截取URI的context以后部分
*
* @param request
* @return
*/
private String getChannel(HttpServletRequest request){
String realUri = ((HttpServletRequest)request).getRequestURI();
String ctxStr = ((HttpServletRequest)request).getContextPath();
if(realUri.length() > ctxStr.length())
return realUri.substring(ctxStr.length());
else
return "/"; // 两者相等时返回"/",避免返回"",AuthManagerImpl验证时要求至少是从"/"开头
}
private static String getHttpBasicAuthUserName(
HttpServletRequest request) {
String basicAuthString = (String) request.getHeader("Authorization");
String decodedBasicAuthString = null;
String username = "NON";
String password = null;
if (basicAuthString != null) {
basicAuthString = basicAuthString.trim();
if (basicAuthString.startsWith("Basic ")) {
decodedBasicAuthString = new String(Base64
.decodeBase64(basicAuthString.substring(6).getBytes()));
}
int collonIndex = decodedBasicAuthString.indexOf(':');
if (collonIndex == -1) {
username = decodedBasicAuthString;
} else {
username = decodedBasicAuthString.substring(0, collonIndex);
password = decodedBasicAuthString.substring(collonIndex + 1);
}
}
return username;
}
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
}