tuckey的urlrewrite又大又蠢,试试这个:import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;/**
 * Rewrites URL patterns.
 */
public class RewriteFilter implements Filter {
    private final Log log = LogFactory.getLog(RewriteFilter.class);
    private ServletContext _context;
    private List<RewriteEntry> _entries = new ArrayList<RewriteEntry>();    public void init(FilterConfig config) throws ServletException {
        _context = config.getServletContext();
        File conf_file = new File(_context.getRealPath("/WEB-INF/rewrite.properties"));
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(conf_file));
            for(;;) {
                String s = reader.readLine();
                if(s==null)
                    break;
                if(s.trim().equals(""))
                    continue;
                if(s.trim().startsWith("#"))
                    continue;
                String[] ss = s.trim().split(" ", 2);
                if(ss.length!=2) {
                    log.warn("Invaild rule: " + s);
                }
                else {
                    log.info("Add rewrite entry: " + s);
                    _entries.add(new RewriteEntry(ss[0], ss[1]));
                }
            }
        }
        catch(PatternSyntaxException pse) {
            log.warn("Syntax exception in RewriteFilter config.", pse);
        }
        catch(IOException ioe) {
            log.warn("Exception in init RewriteFilter.", ioe);
        }
        finally {
            if(reader!=null) {
                try {
                    reader.close();
                }
                catch(IOException e) {}
            }
        }
    }    /**
     * Any cleanup for the filter.
     */
    public void destroy() {}    /**
     * Creates a wrapper to compress the output.
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter)
            throws ServletException, IOException
    {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        req.setCharacterEncoding("UTF-8");
        String url = req.getRequestURI();        for (int i = 0; i < _entries.size(); i++) {
            RewriteEntry entry = _entries.get(i);
            Pattern pattern = entry.getRegexp();
            Matcher matcher = pattern.matcher(url);
            if (! matcher.find(0))
                continue;
            String replacement = replace(matcher, entry.getTarget());
            String query = req.getQueryString();
            if (query != null) {
                if (replacement.indexOf('?') > 0)
                    replacement = replacement + '&' + query;
                else
                    replacement = replacement + '?' + query;
            }
            log.info("forwarding '" + url + "' to '" + replacement + "'");
            if (replacement.startsWith("/")) {
                RequestDispatcher disp = _context.getRequestDispatcher(replacement);
                disp.forward(request, response);
                return;
            }
            else {
                res.sendRedirect(res.encodeRedirectURL(replacement));
                return;
            }
        }
        nextFilter.doFilter(request, response);
    }    private String replace(Matcher matcher, String target) {
        StringBuilder cb = new StringBuilder(512);
        for (int i = 0; i < target.length(); i++) {
            char ch = target.charAt(i);
            if (ch != '$' || i == target.length() - 1)
                cb.append(ch);
            else {
                ch = target.charAt(i + 1);
                if (ch >= '0' && ch <= '9') {
                    int group = ch - '0';
                    cb.append(matcher.group(group));
                    i++;
                }
                else if (ch == '$') {
                    cb.append('$');
                    i++;
                }
                else
                    cb.append('$');
            }
        }
        return cb.toString();
    }    public static class RewriteEntry {
        private Pattern _pattern;
        private String _target;        public RewriteEntry(String pattern, String target) {
            _pattern = Pattern.compile(pattern);
            _target = target;
        }        public Pattern getRegexp() {
            return _pattern;
        }        public String getTarget() {
            return _target;
        }
    }
}