• 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。

  • 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。

  • 其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。

  • 过滤非法请求,如,直接访问上面的main.jsp,那要登录有啥用,过滤掉,让它跳回登录界面
  • 比如说,在Chap05中,运行登录页面,输入用户名和密码之后不是执行action指定的Login这个servlet来获取前台传来的数据,而是先执行过滤器来判断是否放行
  • 代码实现:
  1. 实现Filter接口
  2. 强转servletRequest->request
  3. 获取前台数据
  4. 判断过滤与否

    public class LoginFilter implements Filter{
    
        @Override
        public void destroy() {
            // TODO 自动生成的方法存根
    
        }
        @Override//最主要的方法
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
                throws IOException, ServletException {
            // TODO 自动生成的方法存根
    
            /*怎么过滤呢?比如先获取session,
             * session里面有值的话就直接跳到登录成功的页面那里去
             * 获取要用request,但servletRequest并不是HttpServlet里的request
            */
    
            //直接强转
            HttpServletRequest request=(HttpServletRequest)servletRequest;
    
            HttpSession session =request.getSession();//获取session
            Object o=session.getAttribute("currentUser");//得到的是一个Object
            String path=request.getServletPath();//获取用户请求路径
    
            //o=null:没登录、登录超时。直接转发到登录页面,重定向的话待会又要请求,又要走一遍过滤器
            //path.indexOf("login")<0,不是从login发出的请求,因为是从login发出的请求的话就不是非法请求,
            //应该是走登陆判断而不是过滤器
            if(o==null&&path.indexOf("login")<0) {
                request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
            }else {//假如已经登录了
                filterChain.doFilter(servletRequest, servletResponse);//继续往下请求
            }
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO 自动生成的方法存根
    
        }
    
    }
    
  • 代码实例:HeadFirstServletChap05->com.java1234.filter包->LoginFilter.java