过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
步骤:1、写一个类实现Filter接口,并重写其doFilter方法;
2、注册一个过滤器,在web.xml文件中使用<filter>和<filter-mapping>元素配置filter;
应用场景:自动登录统一,设置编码格式,访问权限,控制敏感字符过滤等
配置拦截资源:
设置dispatcher Types属性
1.request:浏览器请求资源
2.forward:转发访问资源
3.include:包含访问资源
error:错误跳转资源
async:异步访问资源
- 以指定资源匹配。
"/index.jsp"
- 以目录匹配。
"/servlet/*"
- 以后缀名匹配,
"*.jsp"
- 通配符,拦截所有web资源。
"/*"
例子:
@WebFilter("/*")
public class FilterDemo1 implements javax.servlet.Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤成功");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("放行");
}
resp.getWiter().print("")输出
@WebServlet("/ServletDemo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("羽子");
}
}
处理乱码
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
filterChain.doFilter(servletRequest,servletResponse);
xml配置filter过滤器
<filter>
<filter-name>UserFilter</filter-name>
<filter-class>xinhua.com.servletcontrollor.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserFilter</filter-name>
<url-pattern>/pages/*</url-pattern>
</filter-mapping>
结果:输出 resp.getWiter().print("")中文内容