1.urlrewirte servlet filter:
参考文章:
http://tuckey.org/urlrewrite/manual/2.6/
/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.wiki.core.ui;
import org.jboss.seam.ScopeType;
import org.jboss.seam.util.EnumerationEnumeration;
import org.jboss.seam.annotations.*;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.annotations.web.Filter;
import org.jboss.seam.web.AbstractFilter;
import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Collections;
import java.util.Map;
/**
* Adapts the Tuckey URLRewrite filter to the Seam filter chain.
*
* @author Christian Bauer
*/
@Startup
@Scope(ScopeType.APPLICATION)
@Name("wikiUrlRewriteFilter")
@BypassInterceptors
@Filter(within = "org.jboss.seam.web.ajax4jsfFilter")
@Install(classDependencies = "org.tuckey.web.filters.urlrewrite.UrlRewriteFilter", precedence = Install.APPLICATION)
public class WikiUrlRewriteFilter extends AbstractFilter {
private UrlRewriteFilter urlRewriteFilter;
public void init(FilterConfig filterConfig) throws ServletException {
urlRewriteFilter = new UrlRewriteFilter();
urlRewriteFilter.init(new FilterConfigWrapper(filterConfig, getInitParameters()));
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
urlRewriteFilter.doFilter(servletRequest, servletResponse, filterChain);
}
private Map<String, String> initParameters;
public Map<String, String> getInitParameters() {
return initParameters;
}
public void setInitParameters(Map<String, String> initParameters) {
this.initParameters = initParameters;
}
private class FilterConfigWrapper implements FilterConfig {
private FilterConfig delegate;
private Map<String, String> parameters;
public FilterConfigWrapper(FilterConfig filterConfig, Map<String, String> initParameters) {
delegate = filterConfig;
parameters = initParameters;
}
public String getFilterName() {
return delegate.getFilterName();
}
public String getInitParameter(String name) {
if (parameters.containsKey(name)) {
return parameters.get(name);
} else {
return delegate.getInitParameter(name);
}
}
public Enumeration getInitParameterNames() {
Enumeration[] enumerations = {delegate.getInitParameterNames(), Collections.enumeration(parameters.keySet())};
return new EnumerationEnumeration(enumerations);
}
public ServletContext getServletContext() {
return delegate.getServletContext();
}
}
}
2.在component.xml中配置此组件,也可位于WEB-INF/web.xml配置org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.
3.urlrewirte element:
1) rule :
<rule enabled="true">
<from>^/world/([a-z]+)/([a-z]+)$</from>
<to>/world.jsp?country=$1&city=$2</to>
</rule>
2)from :
casesensitive :是否忽略大小写
(optional) false (default) This value will be matched using case insentitive match. ie, "/WellingtoN" will match "/wellington".
3)to :
type options : forward(default),redirect
last options : true or flse --如果此规则成功则其余的规则将被处理
4)set :
type options : request(default),session,response-header,contenttype,charset,loaction,statuts
name options : If type is request, session, response-header, cookie this specifies the name item.
5)condition :
type options : header(default),method,port,remote-addr,time,month,year...
next options : or and(defulat) --链接约束,or(或) and(和)
name options : 与type相对应的type的属性名称,例如type:header,name:user-agent -- 表示header的user-agent(浏览器)属性为..??
6)run : 当url匹配时,执行class中的method
class , method
附: urlrewirte.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
<!--
Rewrite nice URIs to "ugly" internal URIs. This is preparation for any RESTful service layer
we might want to expose later.
We basically have three kinds of GET URIs:
- Wiki document/directory URIs with either numeric identifiers (/123.lace) or area/node names such as /Foo/Bar.
The named URIs rely on the fact that WikiWord names for area/nodes are always starting with an uppercase letter.
The named URIs can have various other modifiers appended, such as /Page/3 or /Tag/Foobar. The representation is
always human-readable HTML.
- URIs to global information pages, such as /user/johndoe or /tag/Foo+Bar. These resources usually aggregate some
information. The distinction between named WikiWord URIs is the lowercase first letter. The representation
is always humand-readable HTML.
- URIs to services, such as feeds and downloads. These always start with /service and representations can vary, e.g.
binary data for image downloads or Atom XML for feeds.
@author Christian Bauer
-->
<urlrewrite>
<!-- Disable the Red Hat crawler -->
<rule>
<from>.*</from>
<condition name="remote-addr">66.187.233.202</condition>
<to last="true" type="temporary-redirect">/robots.txt</to>
</rule>
<!-- Disable anything that comes out of Microsoft -->
<rule>
<from>.*</from>
<condition name="remote-addr">65.55.210.81</condition>
<to last="true" type="temporary-redirect">/robots.txt</to>
</rule>
<!-- Default browser -->
<rule>
<from>.*</from>
<set type="session" name="skin">d</set>
</rule>
<!-- Mobile browser -->
<rule>
<from>.*</from>
<condition next="or" name="user-agent">Windows CE</condition>
<condition next="or" name="user-agent">SonyEricsson</condition>
<condition name="user-agent">BlackBerry</condition>
<set type="session" name="skin">m</set>
</rule>
<!-- /123.html -->
<rule>
<from>^/([0-9]+)\.[a-zA-z]+$</from>
<to last="true">/wiki.seam?nodeId=$1</to>
</rule>
<!-- /search/Foo+Bar+No+Characters+Except+Space -->
<rule>
<from casesensitive="true">^/search/(.+)$</from>
<to last="true">/search_%{session-attribute:skin}.seam?query=$1</to>
</rule>
<!-- /user/foo -->
<rule>
<from casesensitive="true">^/user/([a-zA-Z]?[a-zA-Z0-9]+)$</from>
<to last="true">/userProfile_%{session-attribute:skin}.seam?username=$1</to>
</rule>
<!-- /tag/Foo+Bar-->
<rule>
<from casesensitive="true">^/tag/(.+)$</from>
<to last="true">/tagDisplay_%{session-attribute:skin}.seam?tag=$1</to>
</rule>
<!-- /service/Feed/atom (/Area/Foo) (/Node/Bar) (/Comments/exclude/) (/Tag/Foo+Bar) (/Aggregate/My Aggregate) -->
<rule>
<from casesensitive="true">^/service/Feed/atom(?:/Area/([A-Z0-9]+[A-Za-z0-9]*))?(?:/Node/([A-Z0-9]+[A-Za-z0-9]*))?(?:/Comments/([a-z]+))?(?:/Tag/(.+))?(?:/Aggregate/(.+))?$</from>
<to last="true">/servlets/feeds/atom.seam?areaName=$1&nodeName=$2&comments=$3&tag=$4&aggregate=$5</to>
</rule>
<!-- /service/File/123 -->
<rule>
<from casesensitive="true">^/service/File/([0-9]+)$</from>
<to last="true">/servlets/files/download.seam?fileId=$1</to>
</rule>
<!-- /Foo (/Bar) (/Year/2007 (/Month/08) (/Day/23) (/Page/3) (/Tag/Foo+Bar) (/Category/FooBar) -->
<rule>
<from casesensitive="true">^/([A-Z0-9]+[A-Za-z0-9]*)(?:/([A-Z0-9]+[A-Za-z0-9]*))?(?:/Year/([0-9]{4}))?(?:/Month/([0-9]{2}))?(?:/Day/([0-9]{2}))?(?:/Page/([0-9]+))?(?:/Tag/(.+))?(?:/Category/(.+))?$</from>
<to>/wiki.seam?areaName=$1&nodeName=$2&year=$3&month=$4&day=$5&page=$6&tag=$7&category=$8</to>
</rule>
<!-- /Foo (/Bar) (/Year/2007) (/Month/08) (/Day/23) /Summary -->
<rule>
<from casesensitive="true">^/([A-Z0-9]+[A-Za-z0-9]*)(?:/([A-Z0-9]+[A-Za-z0-9]*))?(?:/Year/([0-9]{4}))?(?:/Month/([0-9]{2}))?(?:/Day/([0-9]{2}))?/Summary$</from>
<to>/wiki.seam?areaName=$1&nodeName=$2&year=$3&month=$4&day=$5&summary=true</to>
</rule>
<!-- Blosxom migration from blog.hibernate.org, the best we can do (you probably can delete all of this):
http://blog.hibernate.org/cgi-bin/blosxom.cgi
http://blog.hibernate.org/cgi-bin/blosxom.cgi/2007/08/
http://blog.hibernate.org/cgi-bin/blosxom.cgi/2007/08/01/
http://blog.hibernate.org/cgi-bin/blosxom.cgi/index.rss
-->
<rule>
<from casesensitive="true">^/cgi-bin/blosxom.cgi$</from>
<to last="true" type="permanent-redirect">%{scheme}://%{server-name}%{context-path}/</to>
</rule>
<rule>
<from casesensitive="true">^/cgi-bin/blosxom.cgi/([0-9]{4})/([0-9]{2})/?$</from>
<to last="true" type="permanent-redirect">%{scheme}://%{server-name}%{context-path}/Bloggers/Everyone/Year/$1/Month/$2</to>
</rule>
<rule>
<from casesensitive="true">^/cgi-bin/blosxom.cgi/([0-9]{4})/([0-9]{2})/([0-9]{2})/?$</from>
<to last="true" type="permanent-redirect">%{scheme}://%{server-name}%{context-path}/Bloggers/Everyone/Year/$1/Month/$2/Day/$3</to>
</rule>
<rule>
<from casesensitive="true">^/cgi-bin/blosxom.cgi/index.rss$</from>
<to last="true" type="permanent-redirect">%{scheme}://%{server-name}%{context-path}/service/Feed/atom</to>
</rule>
<!-- ROOT / -->
<rule>
<from>^/$</from>
<to>/wiki.seam</to>
</rule>
</urlrewrite>