可以看到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(); Listlist = UtilProperties.GetContentByKeytoStringArr("keyContent.properties","invalidWords"); //先清空 response.getWriter().write(""); //只有reqContent不等于null的时候才能对其进行内容的过滤 if(null!=reqContent){ for(int i=0;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