
- 过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
- Filter是一个接口,如果想实现过滤器的功能,必须实现Filter接口
- Filter可以通过注解和xml配置使用
- 过滤请求和响应资源,过滤器可以有多个,多个会变成过滤器链
作用:
它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的 *** 作。
常见应用场景:
核心方法:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。
FilterChain是一个接口,代表过滤器链对象,由Servlet容器提供实现。因为过滤了以后还需要放行,所以FilterChain就可以实现放行
放行的两种过程:
注解版演示:
- 如果有多个过滤器,在第一个过滤器调用下一个过滤器,依次类推直到最终访问资源
- 如果有一个过滤器放行时,就会直接到达最终访问资源
需求:通过Filter过滤器解决多个资源写出中文乱码的问题
过滤器:
// @WebFilter:填写拦截的路径,/*代表拦截所有,如果需要配置具体的类写上具体的类名就可以了
@WebFilter("/*")
public class FilterDemo implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter执行");
// 处理乱码
servletResponse.setContentType("text/html; charset=UTF-8");
// 放行
filterChain.doFilter(servletRequest,servletResponse);
}
}
Servlet类:
@WebServlet("/servletDemo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 浏览器访问就会被拦截器拦下来,然后执行doFilter方法,然后放行
System.out.println("filterServletDemo执行");
resp.getWriter().write("filterServletDemo执行");
}
}
xml版演示:
在xml如果配置多个过滤器那么执行的顺序就是先写哪个,哪个先执行
生命周期:filterDemo com.example.filter.FilterDemo filterDemo /* filterDemo2 com.example.filter.FilterDemo2 filterDemo2 /*
Filter的实例对象在内存中也只有一份。所以也是单例的。
- 出生:当应用加载的时候执行实例化和初始化方法。
- 活着:只要应用一直提供服务,对象就一直存在。
- 死亡:当应用卸载时,或者服务器宕机时,对象消亡。
@WebFilter("/*")
public class FilterDemo02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化成功");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter执行");
// 处理乱码
servletResponse.setContentType("text/html; charset=UTF-8");
// 放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("对象销毁");
}
}
FilterConfig:
FilterConfig一个接口,代表过滤器的配置对象,可以加载一些初始化参数
核心方法:
演示:
public class FilterDemo03 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化成功");
// 获取过滤器名称
System.out.println(filterConfig.getFilterName());
// 根据key获取value
System.out.println(filterConfig.getInitParameter("username"));
// 获取所有参数的key
Enumeration keys = filterConfig.getInitParameterNames();
while (keys.hasMoreElements()){
// 获取每一个key
System.out.println(keys.nextElement());
}
// 获取应用上下文对象
System.out.println(filterConfig.getServletContext());
}
}
xml配置:
过滤器的五种拦截行为:filterDemo02 com.filterDemo.FilterDemo02 username itzhuzhu filterDemo02 /*
我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:
过滤器与Servlet的区别:filterDemo2 com.filterDemo.FilterDemo02 trueusername itzhuzhu filterDemo2 /* REQUEST ERROR FORWARD INCLUDE ASYNC java.lang error.jsp 404 /main/webapp/WEB-INF/error.jsp
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)