📄 regexredirectfilter.java
字号:
// RegexRedirectFilter.java// $Id: RegexRedirectFilter.java,v 1.3 2000/08/16 21:37:38 ylafon Exp $// (c) COPYRIGHT MIT, INRIA and Keio, 1999.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigsaw.filters;import java.net.MalformedURLException;import java.net.URL;import org.w3c.tools.resources.Attribute;import org.w3c.tools.resources.AttributeRegistry;import org.w3c.tools.resources.FramedResource;import org.w3c.tools.resources.ReplyInterface;import org.w3c.tools.resources.RequestInterface;import org.w3c.tools.resources.Resource;import org.w3c.tools.resources.ResourceFilter;import org.w3c.tools.resources.ResourceFrame;import org.w3c.tools.resources.StringArrayAttribute;import org.w3c.jigsaw.http.Reply;import org.w3c.jigsaw.http.Request;import org.w3c.www.http.HTTP;import org.w3c.www.http.HttpReplyMessage;import org.w3c.www.http.HttpRequestMessage;import org.w3c.jigsaw.html.HtmlGenerator;import org.w3c.www.http.HTTP;import org.w3c.www.http.HttpReplyMessage;import org.w3c.www.http.HttpRequestMessage;import org.apache.oro.text.regex.MalformedPatternException;import org.apache.oro.text.regex.Pattern;import org.apache.oro.text.regex.PatternCompiler;import org.apache.oro.text.regex.PatternMatcher;import org.apache.oro.text.regex.Substitution;import org.apache.oro.text.regex.Perl5Compiler;import org.apache.oro.text.regex.Perl5Matcher;import org.apache.oro.text.regex.Perl5Substitution;import org.apache.oro.text.regex.Util;public class RegexRedirectFilter extends ResourceFilter { /* * Attribute index - the URL rewriting patterns */ protected static int ATTR_PATTERNS = -1; static { Class c = null; Attribute a = null; try { c = Class.forName("org.w3c.jigsaw.filters.RegexRedirectFilter"); } catch (Exception ex) { ex.printStackTrace(); System.exit(1); } // Register the PATTERNS attribute: a = new StringArrayAttribute("patterns" , null , Attribute.EDITABLE); ATTR_PATTERNS = AttributeRegistry.registerAttribute(c, a); } Pattern patterns[] = null; String substitutions[] = null; Pattern dec_pat = null; /** * Catch the regexp to reset the precomputed patterns * @param idx The attribute being set. * @param val The new attribute value. */ public void setValue(int idx, Object value) { super.setValue(idx, value); if ( idx == ATTR_PATTERNS ) { synchronized (this) { patterns = null;; } } } private Pattern[] getPatterns() { if (patterns != null) return patterns; String raw_pat[] = (String[]) getValue(ATTR_PATTERNS, null); if (raw_pat == null) return null; patterns = new Pattern[raw_pat.length]; substitutions = new String[raw_pat.length]; int realsize = 0; PatternCompiler compiler = new Perl5Compiler(); PatternMatcher matcher = new Perl5Matcher(); for (int i=0; i<raw_pat.length; i++) { try { if (matcher.matches(raw_pat[i], dec_pat)) { patterns[realsize] = compiler.compile(matcher.getMatch().group(1)); substitutions[realsize] = matcher.getMatch().group(2); realsize++; } } catch (MalformedPatternException ex) { // bad configuration... } } if (realsize != raw_pat.length) { // trim that the hard way :) Pattern t_patterns[] = new Pattern[realsize]; String t_substitutions[] = new String[realsize]; System.arraycopy(patterns, 0, t_patterns, 0, realsize); System.arraycopy(substitutions, 0, t_substitutions, 0, realsize); patterns = t_patterns; substitutions = t_substitutions; } return patterns; } private String[] getSubstitutions() { if (substitutions != null) return substitutions; getPatterns(); return substitutions; } /** * The right syntax for rules is regexp$ substitution * like Apache redirecter rules */ public void initialize(Object values[]) { super.initialize(values); PatternCompiler compiler = new Perl5Compiler(); try { dec_pat = compiler.compile("(.*)\\$\\s+(.*)"); } catch (MalformedPatternException ex) { ex.printStackTrace(); // should never happen } } public ReplyInterface ingoingFilter(RequestInterface request) { Request req = (Request) request; String requrl = req.getURL().toExternalForm(); PatternMatcher matcher = new Perl5Matcher(); Pattern pat[] = getPatterns(); if (pat == null || pat.length == 0) return null; String sub[] = getSubstitutions(); String result = null; for (int i=0; i< pat.length; i++) { if (matcher.matches(requrl, pat[i])) { Substitution s = new Perl5Substitution(sub[i]); result = Util.substitute(matcher, pat[i], s, requrl, Util.SUBSTITUTE_ALL); break; } } if (result != null) { URL loc = null; try { loc = new URL(req.getURL(), result); } catch (MalformedURLException ex) { return null; } Reply reply = req.makeReply(HTTP.FOUND); reply.setLocation(loc); HtmlGenerator g = new HtmlGenerator("Moved"); g.append("<P>This resource has moved, click if your browser" + " doesn't support automatic redirection<BR>"+ "<A HREF=\""+loc.toExternalForm()+"\">"+ loc.toExternalForm()+"</A>"); reply.setStream(g); return reply ; } return null; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -