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;
}
}
}
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;
}
}
}
解决方案 »
- spring3中beans包里的小问题
- 求助:关于TOMCAT的问题
- 请教 命名空间的问题
- 服务器部署网站!?
- 救命!我用ajaxanywhere怎么出现这种错误!!!
- jsp+SQL Server2000 取数据出错Invalid operation for the current cursor position.??谁能指点一下.
- 请问关于分页网页的后台实现
- 请问哪里有免费的weblogic8下载?
- 求 jspSmartUpload上传下载 组件 的下载地址,在网上找了好多地址都不行...
- 如何对一个二维数组排序?在线等,解决马上给分!
- 我用花生壳做一个程序提供外网访问,不知道稳不稳定?你们可以访问吗?帮帮看看!谢谢!
- 报这样的脚本错是什么问题?高手指教: 样式表没有包含文档元素
2.用StringBuilder替代StringBuffer,速度更快完全兼容apache mod_urlrewrite规则,在无数个网站中稳定运行中...
^\/bbs\/board_(.*)_(.*).htm$ /bbs/board.do?id=$1&page=$2
^\/bbs\/topic_(.*)_(.*).htm$ /bbs/topic.do?id=$1&page=$2
^\/bbs\/user_(.*).htm$ /bbs/user.do?id=$1