/ Published in: Java

URL: http://www.oschina.net/code/snippet_12_2832
oschina 原æ¥ä½¿ç”¨çš„æ˜¯ servlet 对 url è¿›è¡Œæ˜ å°„ï¼Œå®žçŽ°ä¾‹å¦‚ http://www.oschina.net/project/tag/19/java è¿™æ ·çš„URL地å€ã€‚servlet 有很多ä¸çµæ´»çš„地方,现改æˆFilter的方å¼â€”—URLMappingFilter。
Expand |
Embed | Plain Text
package net.oschina.servlets; import java.io.*; import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.commons.lang.StringUtils; /** * æ¤è¿‡æ»¤å™¨è´Ÿè´£å¯¹ç¼–ç 进行自动处ç†ï¼Œä»¥åŠæ‰§è¡ŒURLæ˜ å°„è§„åˆ™ * @author Winter Lau (http://www.oschina.net) * @date 2011-1-10 下åˆ02:20:49 */ public class URLMappingFilter implements Filter { private ServletContext context; private String PATH_PREFIX; private String default_base; private HashMap<String, String> other_base = new HashMap<String, String>(); private List<String> ignoreURIs = new ArrayList<String>(); private List<String> ignoreExts = new ArrayList<String>(); @Override public void init(FilterConfig cfg) throws ServletException { this.context = cfg.getServletContext(); //模æ¿å˜æ”¾è·¯å¾„ this.PATH_PREFIX = cfg.getInitParameter("template-path-prefix"); if(this.PATH_PREFIX == null) this.PATH_PREFIX = "/WEB-INF/templates"; else if(this.PATH_PREFIX.endsWith("/")) this.PATH_PREFIX = this.PATH_PREFIX.substring(0, this.PATH_PREFIX.length()-1); //æŸäº›URLå‰ç¼€ä¸äºˆå¤„ç†ï¼ˆä¾‹å¦‚ /img/***) if(ignores != null) ignoreURIs.add(ig.trim()); //æŸäº›URL扩展åä¸äºˆå¤„ç†ï¼ˆä¾‹å¦‚ *.jpg) ignores = cfg.getInitParameter("ignoreExts"); if(ignores != null) ignoreExts.add('.'+ig.trim()); //主域å,必须指定 if(StringUtils.isNotBlank(tmp)) rootDomain = tmp; //二级域åå’Œå¯¹åº”é¡µé¢æ¨¡æ¿è·¯å¾„ @SuppressWarnings("unchecked") Enumeration<String> names = cfg.getInitParameterNames(); while(names.hasMoreElements()){ if(v.endsWith("/")) v = v.substring(0, v.length()-1); if("ignore".equalsIgnoreCase(name) || "ignoreExts".equalsIgnoreCase(name)) continue; if("default".equalsIgnoreCase(name)) default_base = PATH_PREFIX + v; else other_base.put(name, PATH_PREFIX + v); } } @Override public void doFilter(ServletRequest req, ServletResponse res, //自动编ç å¤„ç† HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; RequestContext rc = RequestContext.begin(this.context, request, response); try{ //过滤URLå‰ç¼€ if(req_uri.startsWith(ignoreURI)){ chain.doFilter(rc.request(), rc.response()); return ; } } //过滤URLåŽç¼€ if(req_uri.endsWith(ignoreExt)){ chain.doFilter(rc.request(), rc.response()); return ; } } rc.request().setAttribute(REQUEST_URI, req_uri); rc.forward(vm); rc.redirect(login_page); } finally { if(rc!=null) rc.end(); } } @Override public void destroy() { } StringBuilder vm = new StringBuilder(_GetTemplateBase(req)); if(idx_base == 0) return vm.toString() + VM_INDEX + _MakeQueryString(paths, idx_base); for(int i=0;i<idx_base;i++){ vm.append('/'); vm.append(paths[i]); } String the_path = vms; if(_IsVmExist(the_path + VM_EXT)) return the_path + VM_EXT + _MakeQueryString(paths, idx_base); the_path += VM_INDEX; if(_IsVmExist(the_path)) return the_path + _MakeQueryString(paths, idx_base); vms += VM_EXT; if(_IsVmExist(vms)) return vms + _MakeQueryString(paths, idx_base); return _GetTemplate(req, paths, idx_base-1); } StringBuilder params = new StringBuilder(); int idx = 1; for(int i=idx_base;i<paths.length;i++){ if(params.length()==0) params.append('?'); if(i>idx_base) params.append('&'); params.append("p"); params.append(idx++); params.append('='); params.append(paths[i]); } return params.toString(); } int idx = (rootDomain!=null)?prefix.indexOf(rootDomain):0; if(idx > 0){ prefix = prefix.substring(0, idx - 1); base = other_base.get(prefix); } return (base==null)?default_base:base; } private final static List<String> vm_cache = new Vector<String>(); /** * åˆ¤æ–æŸä¸ªé¡µé¢æ˜¯å¦å˜åœ¨ï¼Œå¦‚æžœå˜åœ¨åˆ™ç¼“å˜æ¤ç»“æžœ * @param path * @return */ if(vm_cache.contains(path)) return true; boolean isVM = testFile.exists() && testFile.isFile(); if(isVM) vm_cache.add(path); return isVM; } }
You need to login to post a comment.