zoukankan      html  css  js  c++  java
  • web项目中的监听器,过滤器以及自定义servlet的执行顺序

      可以看到web容器一启动就会实例化监听器的contextInitialized(ServletContextEvent event)方法,然后是过滤器的init()方法,最后在用户访问web应用的 时候会先执行过滤器的doFilter()方法,以及过滤器链,最后执行继承了HttpServlert的自定义Servlet里复写的doPost()方法或者doGet方法。

     

    1 web容器初始化:

    初始化顺序:

    a.监听器ServletContextListener接口实现类复写的

    1 public void contextInitialized(ServletContextEvent event) {
    2 
    3 }

    b.过滤器Filter接口的实现类复写的

    public void init(FilterConfig filterConfig) throws ServletException {
            String para1 = filterConfig.getInitParameter("para1");
            System.out.println("卫永乐WylFilter.init()...");
        }

    如果有多个过滤器,那么过滤器的初始化顺序是web.xml中配置由下到上的(注意:容器启动的时候的初始化顺序是由下到上,但是在用户进行资源的访问的时候,过滤器复写的

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain)方法是由上至下的,也就是还是按照web.xml中配置的顺序由上到下执行,只是初始化的时候的顺序是相反的

    )。

    2 用户访问web资源:

     容器的执行顺序:

    a.过滤器的doFilter方法,

    @SuppressWarnings("all")
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("卫永乐WylFilter.doFilter() begin...");
            
            /**
             * 设置编码集,统一为UTF-8,这样就不会有乱码的存在,因为除了web容器启动完成后,
             * 每次的请求都会最先被WylFilter先拦截,所以只要在这个地方设置一下字符集就行了,
             * 不需要每次都在自定义的Servlet里设置字符集
             */
            HttpServletRequest httpReq = (HttpServletRequest)request;
            HttpServletResponse resp = (HttpServletResponse)response;
            resp.setCharacterEncoding("UTF-8");
            resp.setHeader("Content-type", "text/html;charset=UTF-8"); 
            
            //增加登录校验
            checkLoginStatus(request,response);
            
            String requestURI = httpReq.getRequestURI().substring(
                    httpReq.getRequestURI().indexOf("/", 1),
                    httpReq.getRequestURI().length());
            System.out.println("requestURI:"+requestURI);
            //如果请求uri不包含 login.jsp,那么就检查是否已经登录了。
            if(requestURI.indexOf("login.jsp")==-1){
                //获取请求内容,对请求内容进行过滤
                String reqContent = httpReq.getQueryString();
                List<String> list = UtilProperties.GetContentByKeytoStringArr("keyContent.properties","invalidWords");
                //先清空
                response.getWriter().write("");
                //只有reqContent不等于null的时候才能对其进行内容的过滤 
                if(null!=reqContent){
                    for(int i=0;i<list.size();i++){
                        if(reqContent.indexOf(list.get(i))!=-1){
                            response.getWriter().write("the request is not valid because it contains:"+list.get(i));
                            System.out.println("the request is not valid because it contains: "+list.get(i));
                        }
                    }
                }
                //getParameterValues()获取键为df的所有值,返回值是数组
                String[] paraValues = request.getParameterValues("df");
                String sss = request.getParameter("df");
                System.out.println("sss:"+sss);
                request.getScheme();//获取请求使用的通讯协议,比如通过http请求,那么返回值就是"http"
                request.getServerName();//获取服务器主机名,实际上就是获取服务器ip地址
                request.getServerPort();//获取服务器端口号
                Enumeration em =  request.getAttributeNames();
                Map map = new HashMap();
                if(em.hasMoreElements()){
                    Object o = em.nextElement();
                    map.put(""+o, o);
                }
                System.out.println("map:"+map);
            }
            chain.doFilter(request, response);
            System.out.println("卫永乐WylFilter.doFilter() end...");
        }

    b.Servlet的doGet(HttpServletRequest req, HttpServletResponse resp)方法或者protected void doPost(HttpServletRequest req, HttpServletResponse resp)方法。

    如果有多个过滤器,那么在第一个过滤器中执行了chain.doFilter(request,response)这行代码后就会执行下一个过滤器的doFilter(request,response)方法,直到执行最后一个过滤器的doFilter(request,response)方法,然后执行Servlet里的doGet(HttpServletRequest req, HttpServletResponse res)方法,

    例如:

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("卫永乐WylServlet1.doGet() begin...");
            Enumeration<Object> em = req.getHeaderNames();
            if(em.hasMoreElements()){
                String headName = (String)em.nextElement();
                String head = req.getHeader(headName);
                System.out.println("卫永乐WylServlet1.doGet()方法执行中...,header:"+head);
            }
            String path = req.getContextPath();
            /*resp.setCharacterEncoding("UTF-8");
            resp.setHeader("Content-type", "text/html;charset=UTF-8"); */
            String content = "我是PrintWriter对象输入到页面的内容,哈哈哈哈,HttpServletRequest.getContextPath()"+path;
            PrintWriter out = resp.getWriter();
            out.write(content);
            System.out.println("卫永乐WylServlet1.doGet() end...");
            
        }
  • 相关阅读:
    C#读写txt文件的两种方法介绍
    C#委托的介绍(delegate、Action、Func、predicate)
    C#邮件发送
    ASP.NET 文件上传于下载
    关于Virtual Box虚拟机里的系统不能启动的解决方法
    unity的yield
    unity文件路径
    手机上的unity路径
    readonly
    unity延迟加载图片
  • 原文地址:https://www.cnblogs.com/Sunnor/p/6381869.html
Copyright © 2011-2022 走看看