package cn.jcenterhome.web.filter; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.imageio.ImageIO; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.jcenterhome.util.Common; import cn.jcenterhome.util.FileHelper; import cn.jcenterhome.util.JavaCenterHome; import cn.jcenterhome.web.servlet.WapperedResponse; public class ContentFilter implements Filter { public void init(FilterConfig fc) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String ac = request.getParameter("ac"); if ("seccode".equals(ac)) { doSeccode(request, response); } else { WapperedResponse wapper = new WapperedResponse(response); if("swfupload".equals(ac) ||("stat".equals(ac) && !Common.empty(request.getParameter("xml")))){ request.setCharacterEncoding("UTF-8"); chain.doFilter(request, wapper); swf_Out(request, response, wapper); }else{ chain.doFilter(request, wapper); String contentType = response.getContentType(); if (contentType != null && contentType.startsWith("application/octet-stream")) { byte[] content = wapper.getByteData(); ServletOutputStream out = response.getOutputStream(); out.write(content); out.flush(); } else { ob_Out(request, response, wapper); } } } } private void doSeccode(HttpServletRequest request, HttpServletResponse response) { String seccode = mkSeccode(); request.getSession().setAttribute("seccode", seccode); int width = 100, height = 40; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); g.setColor(getRandColor(200, 235)); g.fillRect(0, 0, width, height); g.setFont(new Font("Times New Roman", Font.BOLD, 22)); for (int i = 0; i < 4; i++) { g.setColor(new Color(20 + Common.rand(110), 20 + Common.rand(110), 20 + Common.rand(110))); int x = Common.rand(width); int y = Common.rand(height); int xl = Common.rand(width); int yl = Common.rand(height); g.drawLine(x, y, x + xl, y + yl); } for (int i = 0; i < 4; i++) { char rand = seccode.charAt(i); g.setColor(getRandColor(10, 150)); g.drawString(String.valueOf(rand), 24 * i + Common.rand(4), 22 + Common.rand(6)); } g.dispose(); try { response.setContentType("image/JPEG"); ImageIO.write(image, "JPEG", response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } private String mkSeccode() { int seccode = Integer.parseInt(Common.getRandStr(6, true)); String s = Integer.toString(seccode, 24); while (s.length() < 4) { s = "0" + s; } String seccodeUnits = "BCEFGHJKMPQRTVWXY2346789"; StringBuffer secCodeHiddenBuf = new StringBuffer(4); for (int i = 0; i < 4; i++) { int unit = s.charAt(i); if (unit >= 0x30 && unit <= 0x39) { secCodeHiddenBuf.append(seccodeUnits.charAt(unit - 0x30)); } else { secCodeHiddenBuf.append(seccodeUnits.charAt(unit - 0x57)); } } return secCodeHiddenBuf.toString(); } private Color getRandColor(int fc, int bc) { if (fc > 255) { fc = 255; } if (bc > 255) { bc = 255; } int r = fc + Common.rand(bc - fc); int g = fc + Common.rand(bc - fc); int b = fc + Common.rand(bc - fc); return new Color(r, g, b); } private void swf_Out(HttpServletRequest request, HttpServletResponse response, WapperedResponse wapper) throws IOException { String content = wapper.getResponseData(); response.reset(); response.resetBuffer(); response.setContentType("application/xml; charset=UTF-8"); response.setHeader("Expires", "-1"); response.addHeader("Cache-Control", "no-store, private, post-check=0, pre-check=0, max-age=0"); response.setHeader("Pragma", "no-cache"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); out.write(Common.trim(content)); out.flush(); } private void ob_Out(HttpServletRequest request, HttpServletResponse response, WapperedResponse wapper) throws IOException { Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal"); Map<String, Object> sConfig = (Map<String, Object>) request.getAttribute("sConfig"); int allowRewrite = 0; int linkGuide = 0; int headerCharset = 0; if (sConfig != null) { allowRewrite = (Integer) sConfig.get("allowrewrite"); linkGuide = (Integer) sConfig.get("linkguide"); headerCharset = (Integer) sConfig.get("headercharset"); } String content = wapper.getResponseData().trim(); if (allowRewrite > 0) { content = rewriteURL(content, "(?is)\\<a href\\=\"space\\.jsp\\?(uid|do)+\\=([a-z0-9\\=\\&]+?)\"", "space-", 2); content = content.replaceAll("(?i)\\<a href\\=\"space.jsp\"", "<a href=\"space.html\""); content = rewriteURL(content, "(?is)\\<a href\\=\"network\\.jsp\\?ac\\=([a-z0-9\\=\\&]+?)\"", "network-", 1); content = content.replaceAll("(?i)\\<a href\\=\"network.jsp\"", "<a href=\"network.html\""); } if (linkGuide > 0) { content = iframeURL(content, "(?is)\\<a href\\=\"http\\:\\/\\/(.+?)\""); } PrintWriter out = response.getWriter(); Integer inajax = (Integer) sGlobal.get("inajax"); if (inajax != null && inajax > 0) { content = content.replaceAll("([\\x01-\\x09\\x0b-\\x0c\\x0e-\\x1f])+", " "); content = content.replace("]]>", "]]>").trim(); response.setContentType("application/xml; charset=" + JavaCenterHome.JCH_CHARSET); response.setHeader("Cache-Control", "no-store, private, post-check=0, pre-check=0, max-age=0"); response.setHeader("Program", "no-cache"); response.setDateHeader("Expirse", -1); out.write("<?xml version=\"1.0\" encoding=\"" + JavaCenterHome.JCH_CHARSET + "\"?>\n"); out.write("<root><![CDATA[" + Common.trim(content) + "]]></root>"); } else { if (headerCharset == 1) { response.setContentType("text/html; charset=" + JavaCenterHome.JCH_CHARSET); } String uri = request.getRequestURI(); boolean isWriteJsFile = request.getAttribute("isWriteJsFile")==null ? false : (Boolean)request.getAttribute("isWriteJsFile"); if(uri!=null && uri.endsWith("js.jsp")&&isWriteJsFile){ String s = "(?is)\\<div\\s+class=\"pages\"\\>.+?\\</div\\>"; String obcontent = ""; if(!"".equals(content)){ content = content.replaceAll(s, ""); content = content.replaceAll("(\r|\n)", "\n"); Matcher m = Pattern.compile("(?i)\\s+(href|src)=\"(.+?)\"").matcher(content); if(m.find()){ String tag = m.group(1); String url = m.group(2); if(tag!=null&&url!=null){ if(!Common.matches(url,"(?i)^(http\\:\\/\\/|ftp\\:\\/\\/|https\\:\\/\\/|\\/)")) { url = Common.getSiteUrl(request)+url; } StringBuffer buffer = new StringBuffer(); m.appendReplacement(buffer, " "+tag+"=\""+url+"\""); m.appendTail(buffer); content = buffer.toString(); } } String[] lines = content.split("\n"); for(String line:lines){ line = Common.addCSlashes(line.trim(), new char[]{'\'','\\'}); obcontent += "document.writeln('"+line+"');\n"; } }else{ obcontent += "document.writeln('NO DATA')"; } int updatetime = (Integer)request.getAttribute("updatetime"); if(updatetime>0) { int id = (Integer)request.getAttribute("id"); String path = JavaCenterHome.jchRoot+"./data/block_cache/block_"+id+".js"; FileHelper.writeFile(path, obcontent); } content = obcontent; } out.write(content); } out.flush(); } private String rewriteURL(String content, String regex, String pre, int group) { Pattern pCode = Pattern.compile(regex); Matcher m = pCode.matcher(content); StringBuffer b = new StringBuffer(); while (m.find()) { String para = m.group(group); para = para.replace("&", "-"); para = para.replace("=", "-"); m.appendReplacement(b, "<a href=\"" + pre + para + ".html\""); } m.appendTail(b); return b.toString(); } private String iframeURL(String content, String regex) { Pattern pCode = Pattern.compile(regex); Matcher m = pCode.matcher(content); StringBuffer b = new StringBuffer(); while (m.find()) { String url = Common.urlEncode(m.group(1)); m.appendReplacement(b, "<a href=\"link.jsp?url=http://" + url + "\""); } m.appendTail(b); return b.toString(); } public void destroy() { } }