web.xml中元素执行的顺序listener->filter->struts拦截器->servlet。
1.过滤器的概念
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题
2.过滤器的作用描述
在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
3.Filter接口
1.如何驱动
在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中
2.方法介绍
init() Init 方法在 Filter 生命周期中仅执行一次,web 容器在调用 init 方法时
destory() 在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
doFilter() Filter 链的执行
4.FilterChain接口
1.如何实例化
代表当前 Filter 链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中
2.作用
调用过滤器链中的下一个过滤器
Filter开发分为二个步骤:
编写java类实现Filter接口,并实现其doFilter方法。
在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
web.xml <!-- 编码过滤器 -->
<filter>
<filter-name>CharserFilter</filter-name>
<filter-class>com.yc.web.filters.CharserFilter</filter-class>
</filter>
<!--权限过滤器-->
<filter>
<filter-name>AuthorityFilter</filter-name>
<filter-class>com.yc.web.filters.AuthorityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthorityFilter</filter-name>
<url-pattern>/backcust/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthorityFilter</filter-name>
<url-pattern>/backadmin/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharserFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class CharserFilter implements Filter {
private String charset="utf-8";
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//强将arg0 arg1 转为http协议
HttpServletRequest request=(HttpServletRequest)arg0;
HttpServletResponse response=(HttpServletResponse)arg1;
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);
//调用过滤器链
arg2.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
//读取filter的初始化参数 取出配置的charset
if(arg0.getInitParameter("charset")!=null){
this.charset=arg0.getInitParameter("charset");
}
}
public void destroy() {
}