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

1 web容器初始化:

初始化顺序:

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

 public void contextInitialized(ServletContextEvent event) {

 }

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..."); }

web项目中的监听器,过滤器以及自定义servlet的执行顺序的更多相关文章

  1. php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)

    php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...

  2. 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能

    在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...

  3. web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  4. 过滤器(filter),监听器(listener),与servlet的执行顺序

    创建: 加载顺序 监听器-->过滤器-->Servlet.项目启动后,容器会首先创建声明的各种监听器,为后继的各个事件监听做准备,然后创建过滤器,最后是Servlet.销毁的时候是反序进行 ...

  5. web.xml 中的listener、filter、servlet 加载顺序及其【配置详解】

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  6. 转:web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,刚刚就遇到了一个问题,由于项目中使用了quartz任务调度,quartz在web.xml中是使用listener进行监听的,使得在tomcat启动的时候能马上 ...

  7. web.xml 中的listener、 filter、servlet 加载顺序及其详解(转)

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  8. web.xml 中的listener、 filter、servlet 加载顺序

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  9. 1.ssm web项目中的遇到的坑--自定义JQuery插件(slide menu)

    自定义的JQuery插件写的回调函数不执行: 写好了回调函数,将函数打印出来是原形,就是不执行 function () { console.log("---onClickItem---&qu ...

随机推荐

  1. ElasticSearch(一):CentOS7 安装 ElasticSearch6.4.0

    一.安装jre支持 在CentOS中安装ElasticSearch需要Java1.8.0,可执行命令#  java -version查看当前系统所安装Java版本是否为1.8.0版本. 若非1.8.0 ...

  2. tomcat的webapps目录中的abc.war

    1  在tomcat的webapps目录中,会有类似abc.war类型的文件,在tomcat启动时会自动解压为abc目录. 2  如果tomcat在运行中,不要直接删除abc.war文件,删除后,ab ...

  3. RSA简介

    RSA概述 首先看这个加密算法的命名.很有意思,它其实是三个人的名字.早在1977年由麻省理工学院的三位数学家Rivest.Shamir 和 Adleman一起提出了这个加密算法,并且用他们三个人姓氏 ...

  4. GUNS后台管理框架部署与发布

    一.GUNS介绍 Guns基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springmvc + shiro + mybatis-plus + beetl + flowable!Gun ...

  5. iptables 从一台机到另一台机端口转发

    启用网卡转发功能#echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问192.168.0.211:1521端 ...

  6. 002_pip安装失败

    一.安装cmdb的驱动遇到了如下问题 [root@localhost 003_pyenv]# pip2.7 install cmdb_sdk==0.3.1 -i http://cmdb.elenet. ...

  7. 16 python 初学(生成器)

     列表生成器(列表生成式): 使用此种方式生成的列表会放在内存中占用内存 a = [x*2 for x in range(1, 11)] print(a) # >>> [2, 4, ...

  8. 环境部署(六):Git关联github

    我们使用Git进行版本管理,前面的博客也介绍了Linux下安装Git以及Git基础教程,这篇博客,简单介绍下如何使用Git关联github... 更多关于Git的内容,可参考下列内容: Git官方文档 ...

  9. ubuntu下无法在目录下创建文件夹,权限不足解决办法

    问题详情:偶然在根目录创建文件夹的时候,突然显示错误,当时很惊讶,以前没遇见过这样的问题.当时界面是这样的. 用了一个 cd / 命令从用户磁盘跳到了根目录 使用 mkdir 命令准备创建一个文件夹, ...

  10. linux cgroups 简介

    cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统 ...