过滤器指的是实现了Filter接口的Java类。用来拦截请求,已做其他处理。
此路是我开,此树是我栽,要从此路过,留下买路财!
过滤器是全局生效的。
第一种,非注解配置
第二种,注解配置
案例一:字符编码过滤器
以前写Servlet的时候每一个servlet都需要设置request和Response的编码、现在通过过滤器可以在调用servlet之前进行编码工作。
案例二:拦截登录
思想:除了登录页面和登录的请求是无条件的放行。其他的任意只要不登录全部调转到登录页面,一旦登录全部放行。
代码
/**
-
登录拦截过滤器
-
@author IBM
/
@WebFilter("/")
public class LoginFilter implements Filter{@Override
public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
//将父类转成子类
HttpServletRequest request = (HttpServletRequest)servletrequest;
HttpServletResponse response = (HttpServletResponse)servletresponse;//指定一些页面及请求放行 String uri = request.getRequestURI(); System.out.println("URI:"+uri); if(uri.contains("login.jsp") || uri.contains("LoginServlet")) { filterchain.doFilter(servletrequest, servletresponse); }else { //如果不是这两个地址,需要判断现在是否已经登录,如果没有登录直接请求到login.jsp HttpSession session = request.getSession(); //获取session中的账号名称 Object attribute = session.getAttribute("JULK"); if(null != attribute) { filterchain.doFilter(servletrequest, servletresponse); }else { request.setAttribute("msg", "非法操作,如果抓住你,打死你个鳖孙儿"); request.getRequestDispatcher("login.jsp").forward(request, response); } }
}
}
Servlet代码
过滤器链
一个项目中存在多个过滤器就会形成过滤器链。
注解模式按照类的首字母排序ABCD…,如果有首字母相同,会顺延到第二个字母判断。