过滤器是和servlet一个层级的,是web开发的组件.
过滤器的特点是更具url的不同然后执行对应的放行和跳转,常用的就是登陆操作,当然,struts中的拦截器也是有过滤器写的,他的功能会更多.比如格式编码,参数手机,连接池管理,执行时间,日志等等,这个后边会说.
连接器的运行过程:
- 服务器启动(tomcat)启动,初始化所有的filter类,并且调用他们的init()方法.这里需要说明的是,很多的方法不是通过执行他来实现什么功能,而是执行过程会顺道调用它,那么这个就是程序设计者给编程人员来用的,你可以在调用的时候执行什么功能,而不是说不执行你这个方法,程序就无法继续进行.比如说,system.gc();这里的init();
- 请求从客户端发送,到达服务器的web.xml,web.xml是请求道服务器走的第一个组件.
- 在web.xml中,会更具filter-mapping的的url-pattern找到对应的filter-name.
- 通过这个name会匹配到filter中的name,并且找到相应的filter-class文件,进入这个类中执行.
- 在对应的过滤类中主要执行的是dofilter方法,这个方法的参数实际上就是request/response/chain,那么执行的放行的是chain.dofilter(),然后执行下一个过滤器或者是servlet.
- 之后按照过滤器的顺序反相执行,并且调用destory方法.
- 当web的生命结束之后,过滤器也会随之结束.
实例:
//web.xml的配置
<filter>
<filter-name>login</filter-name>
<filterclass>路径</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//代码
// 控制用户访问权限
public class SecurityFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
if (session.getAttribute("username") != null) {
// 登录后才能访问
chain.doFilter(request, response);
} else {
res.sendRedirect("../failure.jsp");
} } }