过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。
- 过滤非法请求,如,直接访问上面的main.jsp,那要登录有啥用,过滤掉,让它跳回登录界面
- 比如说,在Chap05中,运行登录页面,输入用户名和密码之后不是执行action指定的Login这个servlet来获取前台传来的数据,而是先执行过滤器来判断是否放行
- 代码实现:
- 实现Filter接口
- 强转servletRequest->request
- 获取前台数据
判断过滤与否
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