package zx.soft.zk.manager.utils; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.zookeeper.ZooKeeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public enum ServletUtil { INSTANCE; private final static Logger logger = LoggerFactory.getLogger(ServletUtil.class); public void renderHtml(HttpServletRequest request, HttpServletResponse response, Map<String, Object> templateParam, String view) throws IOException, TemplateException { if (request != null && response != null && templateParam != null) { //There is no way to access session info in freemarker template. //Hence all view rendering happens via this function which adds session info to attribute for each request. HttpSession session = request.getSession(); if (session != null) { //Flash messages are always set at session level and need to be propgrated to attributes. //They are reset after being displayed once. if (session.getAttribute("flashMsg") != null) { templateParam.put("flashMsg", session.getAttribute("flashMsg")); session.setAttribute("flashMsg", null); } templateParam.put("authName", session.getAttribute("authName")); templateParam.put("authRole", session.getAttribute("authRole")); response.setContentType("text/html"); Template template = null; Configuration config = new Configuration(); config.setClassForTemplateLoading(request.getServletContext().getClass(), "/"); template = config.getTemplate("/webapp/template/" + view); try (Writer out = new OutputStreamWriter(response.getOutputStream())) { template.process(templateParam, out); out.flush(); } } } } public void renderError(HttpServletRequest request, HttpServletResponse response, String error) { try { logger.error("Error :" + error); Map<String, Object> templateParam = new HashMap<>(); response.setContentType("text/html"); Template template = null; Configuration config = new Configuration(); config.setClassForTemplateLoading(request.getServletContext().getClass(), "/"); template = config.getTemplate("/webapp/template/error.ftl.html"); templateParam.put("error", error); try (Writer out = new OutputStreamWriter(response.getOutputStream())) { template.process(templateParam, out); out.flush(); } } catch (TemplateException | IOException ex) { logger.error(ex.getMessage()); } } public ZooKeeper getZookeeper(HttpServletRequest request, HttpServletResponse response, String zkServer) { try { HttpSession session = request.getSession(); ZooKeeper zk = (ZooKeeper) session.getAttribute("zk"); if (zk == null || zk.getState() != ZooKeeper.States.CONNECTED) { zk = ZooKeeperUtil.INSTANCE.createZKConnection(zkServer); if (zk.getState() != ZooKeeper.States.CONNECTED) { session.setAttribute("zk", null); } else { session.setAttribute("zk", zk); } } return zk; } catch (IOException | InterruptedException ex) { logger.error(ex.getMessage()); } return null; } public String externalizeNodeValue(String value) { return value == null ? null : value.replaceAll("\\n", "\\\\n").replaceAll("\\r", ""); // We might want to BASE64 encode it } //Using X-Forwarded-For to capture IP addresses coming via load balancer. public String getRemoteAddr(HttpServletRequest request) { String remoteAddr = request.getHeader("X-Forwarded-For"); if (remoteAddr == null) { remoteAddr = request.getRemoteAddr(); } return remoteAddr; } }