定义:用于对request或response进行拦截,在用户的请求到达指定的URI之前,先过Filter的拦截处理规则(逻辑代码的处理修改),之后再正常处理用户请求。
Filter三个接口方法:
init(FilterConfig filterConfig) 过滤器初始化,在整个Filter声明周期中只执行一次
doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 过滤器其主体方法,一次用户请求调用一次,可以多次重复调用
destroy() 过滤器销毁,在整个Filter声明周期中只执行一次
实现过滤器功能:
1. 定义一个普通的类,实现Filter(javax.servlet.Filter)接口
2.书写内置方法:
public class ServletFilter implements javax.servlet.Filter { @Override //过滤器初始化,在整个Filter声明周期中只执行一次 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("this is init working"); } @Override //过滤器其主体方法,一次用户请求调用一次,可以多次重复调用 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("this is doFilter working"); } @Override //过滤器销毁,在整个Filter声明周期中只执行一次 public void destroy() { System.out.println("this is destroy working"); } }
3.在web.xml定义过滤规则
<!--Servlet Filter过滤器--> <filter> <filter-name>ServletFilter</filter-name> <filter-class>com.nz.filter.ServletFilter</filter-class> </filter> <filter-mapping> <filter-name>ServletFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
可以用注解实现,替代web.xml配置
@WebFilter(filterName = "LoginFilter",urlPatterns = "/admin/*")
例如.处理过滤器的乱码需求:
1.doFilter()写处理乱码逻辑:
//处理请求乱码 req.setCharacterEncoding("utf-8"); //处理响应代码 resp.setContentType("text/html;charset=utf-8"); //继续执行请求 filterChain.doFilter(servletRequest,servletResponse);
2.继续执行请求
Chain.doFilter(request,response);
3.过滤规则
/*当前项目下全部url请求
例如:不能登录不能访问需求
1.在doFilter()写代码逻辑:
//转换 强转 HttpServletRequest req =(HttpServletRequest)servletRequest; HttpServletResponse resp =( HttpServletResponse)servletResponse; //获取session HttpSession session=req.getSession(); User user = (User) session.getAttribute("user"); //判断 if(user==null){ resp.sendRedirect("/login.jsp"); } //继续执行 filterChain.doFilter(servletRequest,servletResponse);
2.继续执行请求
Chain.doFilter(request,response);
3.过滤规则
/admin/* 当前项目下全部/admin之后的请求