package com.jfinal.plugin.druid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.alibaba.druid.stat.DruidStatService;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.util.IPRange;
import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import com.alibaba.druid.util.IOUtils;
import com.jfinal.handler.Handler;
import com.jfinal.util.HandlerKit;
/**
* 替代 StatViewServlet
*/
@SuppressWarnings("unused")
public class DruidStatViewHandler extends Handler {
private IDruidStatViewAuth auth;
private String visitPath = "/druid";
private StatViewServlet servlet = new JFinalStatViewServlet();
public DruidStatViewHandler(String visitPath) {
this.visitPath = visitPath;
this.auth = new IDruidStatViewAuth(){
public boolean isPermitted(HttpServletRequest request) {
return true;
}};
}
public DruidStatViewHandler(String visitPath , IDruidStatViewAuth druidStatViewAuth) {
this.visitPath = visitPath;
this.auth = druidStatViewAuth;
}
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
if (target.startsWith(visitPath)) {
isHandled[0] = true;
if (target.equals(visitPath) && !target.endsWith("/index.html")) {
HandlerKit.redirect(target += "/index.html", request, response, isHandled);
return ;
}
try {
servlet.service(request, response);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
else {
nextHandler.handle(target, request, response, isHandled);
}
}
@SuppressWarnings("serial")
class JFinalStatViewServlet extends StatViewServlet {
public boolean isPermittedRequest(HttpServletRequest request) {
return auth.isPermitted(request);
}
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String contextPath = request.getContextPath();
// String servletPath = request.getServletPath();
String requestURI = request.getRequestURI();
response.setCharacterEncoding("utf-8");
if (contextPath == null) { // root context
contextPath = "";
}
// String uri = contextPath + servletPath;
// String path = requestURI.substring(contextPath.length() + servletPath.length());
int index = contextPath.length() + visitPath.length();
String uri = requestURI.substring(0, index);
String path = requestURI.substring(index);
if (!isPermittedRequest(request)) {
path = "/nopermit.html";
returnResourceFile(path, uri, response);
return;
}
if ("/submitLogin".equals(path)) {
String usernameParam = request.getParameter(PARAM_NAME_USERNAME);
String passwordParam = request.getParameter(PARAM_NAME_PASSWORD);
if (username.equals(usernameParam) && password.equals(passwordParam)) {
request.getSession().setAttribute(SESSION_USER_KEY, username);
response.getWriter().print("success");
} else {
response.getWriter().print("error");
}
return;
}
if (isRequireAuth()
&& session.getAttribute(SESSION_USER_KEY) == null
&& !("/login.html".equals(path) || path.startsWith("/css") || path.startsWith("/js") || path.startsWith("/img"))) {
if (contextPath == null || contextPath.equals("") || contextPath.equals("/")) {
response.sendRedirect("/login.html");
} else {
response.sendRedirect("login.html");
}
return;
}
if ("".equals(path)) {
if (contextPath == null || contextPath.equals("") || contextPath.equals("/")) {
response.sendRedirect("/druid/index.html");
} else {
response.sendRedirect("druid/index.html");
}
return;
}
if ("/".equals(path)) {
response.sendRedirect("index.html");
return;
}
if (path.indexOf(".json") >= 0) {
String fullUrl = path;
if (request.getQueryString() != null && request.getQueryString().length() > 0) {
fullUrl += "?" + request.getQueryString();
}
response.getWriter().print(statService.service(fullUrl));
return;
}
// find file in resources path
returnResourceFile(path, uri, response);
}
private void returnResourceFile(String fileName, String uri,
HttpServletResponse response) throws ServletException,
IOException {
if (fileName.endsWith(".jpg")) {
byte[] bytes = IOUtils.readByteArrayFromResource(RESOURCE_PATH
+ fileName);
if (bytes != null) {
response.getOutputStream().write(bytes);
}
return;
}
String text = IOUtils.readFromResource(RESOURCE_PATH + fileName);
if (text == null) {
response.sendRedirect(uri + "/index.html");
return;
}
if (fileName.endsWith(".css")) {
response.setContentType("text/css;charset=utf-8");
} else if (fileName.endsWith(".js")) {
response.setContentType("text/javascript;charset=utf-8");
}
response.getWriter().write(text);
}
}
private final static Log LOG = LogFactory.getLog(StatViewServlet.class);
private static final long serialVersionUID = 1L;
public static final String PARAM_NAME_RESET_ENABLE = "resetEnable";
public static final String PARAM_NAME_ALLOW = "allow";
public static final String PARAM_NAME_DENY = "deny";
public static final String PARAM_NAME_USERNAME = "loginUsername";
public static final String PARAM_NAME_PASSWORD = "loginPassword";
public static final String SESSION_USER_KEY = "druid-user";
private final static String RESOURCE_PATH = "support/http/resources";
private final static String TEMPLATE_PAGE_RESOURCE_PATH = RESOURCE_PATH + "/template.html";
private DruidStatService statService = DruidStatService.getInstance();
public String templatePage;
private List<IPRange> allowList = new ArrayList<IPRange>();
private List<IPRange> denyList = new ArrayList<IPRange>();
private String username = null;
private String password = null;
}