监听器和过滤器笔记

8.监听器
=================================================
注册监听器两种方法:
1.@WebListener注解
@WebListener
public class ListenerClass implements ListenerInterface{}

2.web.xml中使用一个listener元素。
<listener>
    <listener-class>fully-qualified listener class</listener-class>
</listener>


Servlet Context监听器 -- 实现接口ServletContextListener
1.ServletContextListener:对ServletContext的初始化和解构做出响应。
    void contextInitialized(ServletContextEvent event); --->主要重写的方法
    void contextDestroyed(ServletContextEvent event);
2.ServletContextAttributeListener:
    void attributeAdded(ServletContextAttributeEvent scae);
    void attributeRemoved(ServletContextAttributeEvent scae);
    void attributeReplaced(ServletContextAttributeEvent scae);
    
Session监听器 -- 实现接口HttpSessionListener
1.HttpSessionListener
2.HttpSessionActivationListener
3.HttpSessionAttributeListener
4.HttpSessionBindingListender

用户计数器实例

ServletRequest监听器 -- 实现接口ServletRequestListener
1.ServletRequestListener
2.ServletRequestAttributeListener
3.AsyncListener

用户访问时间

9.过滤器
=================================================
过滤器是指拦截请求,并对传给被请求资源的ServletRequest或ServletResponse进行处理的一个对象。

Filter API
包括:Filter,FilterConfig和FilterChain。
过滤器必须实现javax.servlet.Filter接口。3个方法:
void init(FilterConfig filterConfig);
void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc);
void destory()

FilterConfig接口的方法:
public String getFilterName();
public ServletContext getServletContext();
public String getInitParameter(String name);
public Enumeration<String> getInitParameterNames();

FilterChain接口的方法:
public void doFilter(ServletRequest request, ServletResponse response);

配置过滤器方法:
1.@WebFilter注解
2.web.xml中使用filter和filter-mapping元素
	<filter>
		<filter-name>xxx</filter-name>
		<filter-class>yyy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>xxx</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

范例1:日志过滤器
范例2:图片保护过滤器
范例3:下载计数过滤器

过滤器的顺序:按web.xml中写的顺序调用。


10.应用程序设计
配置JNDI Datasource步骤:
1.拷贝JDBC驱动mysql-connector-java-5.1.44-bin.jar到tomcat/lib/目录下。
2.Context配置:META-INF/context.xml
<Context>
  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxTotal="100" maxIdle="30" maxWaitMillis="10000"
               username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://192.168.15.45:3307/a_spider_test"/>
</Context>
3.web.xml配置:WEB-INF/web.xml
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
4.编写代码:
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/TestDB");
Connection con = dataSource.getConnection();

  

12.异步处理
=================================================
异步Servlet,Filter
1.方法一:WebServlet注解
@WebServlet(asyncSupported=true ...)
@WebFilter(asyncSupported=true ...)
2.方法二:利用web.xml中的servlet或filter元素的元素async-supported。
    <servlet>
        <servlet-name>AsyncServlet</servlet-name>
        <servlet-class>servlet.MyAsyncServlet</servlet-class>
        <async-supported>true</async-supported>
    </servlet>

编写异步Servlet步骤:
1.在ServletRequest中调用startAsync().返回一个AsyncContext;
2.在AsyncContext中调用setTimeout(),设置一个容器必须等待指定任务完成的毫秒数。任务没在规定时间完成,将抛出异常;
3.调用asyncContext.start方法,传递一个Runnable;
4.任务完成时,通过Runnable调用asyncContext.complete方法或者asyncContext.dispatch方法;

=================================================
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("===============>start");
		AsyncContext context = req.startAsync();
		req.setAttribute("mainThread", Thread.currentThread().getName());
		context.setTimeout(5000);
		context.start(()->{
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("=============>thread");
			req.setAttribute("workerThread", Thread.currentThread().getName());
			context.dispatch("/jsp/threadNames.jsp");
		});
	}
	
}
=================================================
异步监听器
void onComplete(AsyncEvent event) throws IOException;
void onTimeout(AsyncEvent event) throws IOException;
void onError(AsyncEvent event) throws IOException;
void onStartAsync(AsyncEvent event) throws IOException;

asyncContext.addListener(new MyAsyncListener())


15.安全性
=================================================
conf/tomcat-users.xml文件可以创建用户和角色。

javax.servlet.annotation中与安全相关的3个注解类型:
1.ServletSecurity
2.HttpConstraint
3.HttpMethodConstraint

  

posted @ 2019-11-01 17:41  hot小热  阅读(222)  评论(0编辑  收藏  举报