package chat.server;
|
|
import java.io.ByteArrayOutputStream;
|
import java.io.IOException;
|
import java.io.PrintStream;
|
import java.io.PrintWriter;
|
import java.io.UnsupportedEncodingException;
|
import java.net.URLDecoder;
|
import java.net.URLEncoder;
|
import java.util.HashSet;
|
import java.util.Set;
|
|
import javax.servlet.Filter;
|
import javax.servlet.FilterChain;
|
import javax.servlet.FilterConfig;
|
import javax.servlet.RequestDispatcher;
|
import javax.servlet.ServletContext;
|
import javax.servlet.ServletException;
|
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletResponse;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
|
import org.apache.log4j.Logger;
|
|
import chat.server.call.JSONObject;
|
|
|
public class AppDispatcher implements Filter {
|
|
private static Logger logger;
|
private static AppDispatcher instance;
|
|
private static String contextPath;
|
private static int contextLength;
|
private static Set<String> resourceSet;
|
|
|
static {
|
logger = Logger.getLogger(AppDispatcher.class);
|
}
|
|
public AppDispatcher() {
|
instance = this;
|
initResourceList();
|
}
|
|
public synchronized static AppDispatcher getInstance() {
|
if (instance == null) {
|
instance = new AppDispatcher();
|
}
|
|
return instance;
|
}
|
|
public void init(FilterConfig filterConfig) throws ServletException {
|
ServletContext servletContext = filterConfig.getServletContext();
|
|
contextPath = servletContext.getContextPath();
|
contextLength = contextPath.length();
|
}
|
|
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
|
HttpServletRequest request = (HttpServletRequest) req;
|
HttpServletResponse response = (HttpServletResponse) res;
|
|
request.setCharacterEncoding("utf-8");
|
|
try {
|
String uri = request.getRequestURI();
|
|
logger.debug("filter request URI:" + uri);
|
|
uri = uri.substring(contextLength);
|
|
int pos_root = uri.lastIndexOf("/root/");
|
uri = pos_root >= 0 ? uri.substring(pos_root + 5) : uri;
|
|
try {
|
uri = URLDecoder.decode(uri, "UTF-8");
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
//1.
|
String suffix = getSuffix(uri);
|
|
if (resourceSet.contains(suffix)) {
|
RequestDispatcher dispatcher = request.getRequestDispatcher(uri);
|
dispatcher.forward(request, response);
|
return;
|
}
|
|
//2.
|
// RequestParams dataPool = new RequestParams(request);
|
// HttpResultPool resultPool = new HttpResultPool(response);
|
|
// console.receive(uri, dataPool, resultPool);
|
// writeResultPool(response, resultPool);
|
return;
|
}
|
catch (Exception e) {
|
String error = printStackToString(e);
|
logger.error("dispatch error:" + e.getMessage());
|
logger.error(error);
|
writeError(request, response, error);
|
}
|
}
|
|
private void writeError(HttpServletRequest request, HttpServletResponse response, String error) throws IOException {
|
PrintWriter writer = response.getWriter();
|
|
JSONObject json = new JSONObject();
|
json.beginObject();
|
json.addValue("success", false);
|
json.addValue("errorcode", "ServerError");
|
json.addValue("errorMessage", encode(error));
|
json.endObject();
|
writer.print(json.toString());
|
|
writer.flush();
|
}
|
|
public void destroy() {
|
|
}
|
|
private String printStackToString(Exception e) {
|
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
|
PrintStream printStream = new PrintStream(outStream);
|
e.printStackTrace(printStream);
|
|
return outStream.toString();
|
}
|
|
private String encode(String value) throws UnsupportedEncodingException {
|
return URLEncoder.encode(value, "UTF-8");
|
}
|
|
private void initResourceList() {
|
resourceSet = new HashSet<String>();
|
resourceSet.add(".html");
|
resourceSet.add(".css");
|
resourceSet.add(".js");
|
resourceSet.add(".png");
|
resourceSet.add(".jpg");
|
resourceSet.add(".bmp");
|
resourceSet.add(".icon");
|
}
|
|
private String getSuffix(String uri) {
|
String result = null;
|
|
int pos = uri.lastIndexOf(".");
|
|
if (pos <= 0) {
|
return result;
|
}
|
|
result = uri.substring(pos);
|
result = result.toLowerCase();
|
|
return result;
|
}
|
|
}
|