Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息、过滤不安全的输入等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:
举例:
1、创建一个Get restful接口
@GetMapping(value="/v2/get_user_info") public Object getUserInfo(String name,int age){ return "name:"+name+" "+"age:"+age; }
2、创建一个filter,判断上述的name参数值是否等于admin,等于admin正常返回,不等于admin,重定向到myerror.html
package net.Eleven.demo.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //@Component //@ServletComponentScan @WebFilter(urlPatterns = "/v2/*",filterName = "loginFilter") public class LoginFilter implements Filter { //容器加载时被调用 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init loginFilter"); } //请求被拦截的时候调用 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String username = request.getParameter("name"); if ("admin".equals(username)){ filterChain.doFilter(servletRequest,servletResponse); } else { response.sendRedirect("/myerror.html"); } } @Override public void destroy() { System.out.println("destroy loginFiler"); return; } }
- 创建的filter要使用@WebFilter(urlPatterns = "/v2/*",filterName = "loginFilter")注解,urlPatterns支持正则,filtName表示filter的名称
- 创建的filter要实现Filter接口,并重写Filter接口的三个方法
3、执行结果