Filter,它的名字是过滤器,可以批量拦截修改servlet的请求和响应。
需要实现接口Filter
配置
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>anni.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
filter标签部分定义使用的过滤器,
filter-mapping标签告诉服务器把哪些请求交给过滤器处理。这里的
/*表示所有请求,
/表示根路径,
*(星号)代表所有请求,加在一起就变成了根路径下的所有请求。
EncodingFilter.java,来批量设置请求编码。
package anni; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class EncodingFilter implements Filter { public void init(FilterConfig config) throws ServletException {} public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding( "gb2312" ); chain.doFilter(request, response); } }
用filter控制用户访问权限
两个点(..)代表当前路径的上一级路径
你可以使用三种方式定义url-pattern
1.直接映射一个请求。
<servlet-mapping>
<servlet-name>ContactServlet</servlet-name>
<url-pattern>/contact.do</url-pattern>
</servlet-mapping>
2,映射一个路径下的所有请求。
<servlet-mapping> <servlet-name>EncodingFilter</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
如果这个路径下还有子路径,那么子路径下的请求也会被过滤操作
需要注意的是,这种写法必须以/开头,写成与绝对路径的形式,即便是映射所有请求也要写成/*,不能简化成*
3.映射结尾相同的一类请求
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这样做的一个好处是语义更清楚,只要看到以.do结尾的请求就知道肯定是交给ControllerServlet处理了,不管这个请求是在根路径还是子路径下,都会准确无误的找到对应的servlet。
缺点就是不同路径之间进行forward,jsp里就不能再使用相对路径了
过滤链
服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。
而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码
filter详细配置
<filter-mapping> <filter-name>TestFilter</filtername> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>EXCEPTION</dispatcher> </filter-mapping>
filter过滤指定的servlet
< filter-mapping > <filter-name>TestFilter</filter-name> <servlet-name>TestServlet</servlet-name> < /filter-mapping