过滤器是一个特殊的servlet,所有的过滤器都要实现Filter接口
注:定义过Filter以后一定要在web.xml中进行注册
在web.xml中进行注册
<filter> <filter-name>注册过滤器的名称</filter-name> <filter-class>过滤器所在类的完整名称</filter-class> </filter> <filter-mapping> <filter-name>注册号的过滤器的名称</filter-name> <url-pattern>配置拦截的资源/*拦截所有的</url-pattern> * /* 表示拦截所有的资源 * *.jsp 表示拦截所有的jsp * /c.jsp 表示只拦截根路径下的c.jsp * *.do * 前不加/ <servlet-name>指定拦截的servlet名称,servlet-name标签中的值</servlet-name> 可以讲jsp页面配置成一个servlet,然后使用上面的方法拦截,访问的时候输入的是配置的servlet名称 <dispatcher>REQUEST</dispatcher> 当用户直接访问页面时,web容器将会调用过滤器,默认值 如果目标资源是通过getRequestDispatcher()的include或者forward,不会通过过滤器 <dispatcher>FORWARD</dispatcher> 当用户转发时走过滤器, 如果目标资源是通过getRequestDispatcher()的forward访问时要走过滤器 使用forward拦截的路径是要转发的那个页面的路径 <dispatcher>FORWARD</dispatcher> 如果目标资源是通过getRequestDispatcher()的include访问时要走过滤器 使用include时拦截的路径还是引入前的那个路径,不会发生变化 <dispatcher>ERROR</dispatcher> 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用 ** 可以同时配置REQUEST和FORWARD和INCLUDE和ERROR <filter-mapping>
过滤器的生命周期
init,doFilter,destroy
过滤器中构造方法的优先级别大于init方法
构造方法执行一次,表示过滤器是单实例多线程的运行的,和servlet一样
init(FilterConfig filterConfig)
初始化,在服务器开启的时候就被初始化(由servlet容器调用)
而servlet要想在服务器启动的时候执行,需要配置一个load-on-startup 属性
FilterConfig
* getFilterName();// 获取filter的注册名称
* getInitParameter("在web.xml中配置的初始化参数");
* Enumeratin<String> em =getInitParameterNames();//遍历过滤器中所有的配置的参数
while(em.hasmoreElement){
name=em.nextElement();
}
* getServletContext().getInitParameter("name");
doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
在生命周期中执行多次,客户端每发送一次请求,该方法执行一次
由servlet容器调用
servletRequest 可以强转HttpServletRequest 可以强转
FiterChain chain
chain.doFilter(req,res);//放行
destroy()
只在服务器关闭的时候执行一次
同一个过滤器可以配置多个映射
一个映射可以配置多个过滤器,也叫过滤器的串联
如果有多个过滤器拦截同一个资源,执行的顺序是按照过滤器在web.xml中配置的filter-mapping的先后顺序执行
案列:通过过滤器设置编码格式
web.xml配置文件中的内容
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.yxkong.filter.CharacterEncodingFilter</filter-class> <!--配置字符编码 --> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <!-- 配置响应需要的MIME类型 --> <init-param> <param-name>contentType</param-name> <param-value>text/html</param-value> </init-param> <!-- 配置是否设置响应的字符编码和MIME类型 --> <init-param> <param-name>isEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
过滤器中的实现
public class CharacterEncodingFilter implements Filter { private String encoding; //接收编码 private String contentType; private Boolean isEncoding; public void init(FilterConfig filterConfig) throws ServletException { this.encoding = filterConfig.getInitParameter("encoding"); this.contentType = filterConfig.getInitParameter("contentType"); String sisEncoding = filterConfig.getInitParameter("isEncoding"); if (sisEncoding != null && !"".equals(sisEncoding.trim())) { this.isEncoding = Boolean.parseBoolean(sisEncoding); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 只对post请求有效 HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String method = req.getMethod(); if ("post".equalsIgnoreCase(method)) { if (req.getCharacterEncoding() == null) { if (this.encoding != null) { req.setCharacterEncoding(this.encoding); } } if (this.isEncoding) { // true 执行 if (this.encoding != null) { response.setCharacterEncoding(this.encoding); } if (contentType != null) { response.setContentType(contentType); } } } chain.doFilter(request, response); } public void destroy() { } }
文章评论