zoukankan      html  css  js  c++  java
  • Fliter--过滤器

    过滤器的概念:

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

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

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

    用户在发送请求,tomcat服务器拿到请求后,执行对应的servlet,给用户响应内容。有了过滤器后,用户发送请求,服务器tomcat接受到请求后,先执行过滤器,然后再去执行servlet

    Filter:在执行用户请求的资源之前,会先执行过滤器,若过滤器放行的话,才会执行用户请求的资源,若过滤器没有放行,则用户请求的资源就无法执行了

    使用场景:

    1、未登录用户的拦截

    2、集中代码的切入(中文乱码问题的集中处理)

    3、统计程序代码的执行效率

     Filter作用

       1:可以拦截请求(request)

       2也可以拦截响应(response)

       3放行同意通过连接器

       4:统计

    如何创建一个filter

       1实现一个接口 filter

       2:在web.xml中注册或在Filter中使用注解的方式@WebFliter("/*"),下边例子中使用注解的方式

    在web.xml文件中进行配置
    <filter>
        <display-name>FilterDemo1</display-name>
        <filter-name>FilterDemo1</filter-name>
        <filter-class>com.aaa.filter.LoginFilter</filter-class>

    </filter>
    <filter-mapping>
        <filter-name>FilterDemo1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    对用户是否登录进行拦截

    package com.aaa.Fliter;

    import javax.servlet.*;
    import javax.servlet.Filter;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;

    //采用注解方式配置:拦截所有请求                                           
    @WebFilter("/*")                                                                                    
    public class Filter2 implements Filter {
        public void destroy() {
           System.out.println("...........过滤器销毁.........");
        }

        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            //先将req和resp转换成HttpServlet类型
           HttpServletRequest request=(HttpServletRequest) req;
           HttpServlerResponse response=(HttpServletResponse) resp;

           //获取session中的对象(user)判断是否为null
           Object user=request.getSession().getAttribute("user");
           if(user!=null){
              //user不为空说明已经登录,放行
             chain.dofilter(request,response);
              }else{
              //user为空说明没有登录,跳转到登录界面,但是并不是所有的请求都要拦截,在这里还要去除一些,像请求登录界面,调用登录功能
               String  strs[]={"login.jsp","LS"};
              //获取用户请求路径,然后判断用户请求路径中是否包含strs[]中的路径,如果包含就放行
               String requestURI=request.getRequestURI();//得到请求的路径
               //requestURI.contains("login.jsp");
               // contanins:包含的判断,判断requestURI中的路径是否包含括号中的路径,如果有返回true,如果没有返回false
                boolean tag=false;//利用tag的值判断是否拦截本此请求
                //利用加强型for循环来对strs[]进行遍历
                for(String str:strs){
                      if(request.contains(str)){
                            tag=true;
                            break;//tag为true时,跳出循环,因为已经匹配上资源了
                          }
                   }
                 //通过对tag的判断来看是否拦截此次请求
                 if(tag){
                        chain.doFilter(request,response);
                   }else{
                     response.sendRedirect("/lizzhen626/views/login.jsp(登录界面的项目路径)");
                   }
               }
          }

        public void init(FilterConfig config) throws ServletException {
           System.out.println("............过滤器打开...........");

        }

    }

  • 相关阅读:
    wtforms
    day 036 线程 -创建,守护线程
    day 035 管道 和数据共享
    day034 锁,信号量,事件,队列,子进程与子进程通信,生产者消费者模型,joinableQueue
    day33 创建进程的方法和相关操作
    day 32并行 并发
    day 31 socketserver 和ftp打印进度条
    day 029 缓冲区和粘包 day 30 粘包的解决
    相关英语简称
    【实战】初识ListView及提高效率
  • 原文地址:https://www.cnblogs.com/fbbg/p/11099551.html
Copyright © 2011-2022 走看看