1.监听器

为了能够在Servlet/JSP应用程序中进行事件驱动编程,Servlet API提供了一整事件类和监听器接口。监听器有三个级别:ServletContext、HttpSession、HttpServletRequest,其对应的监听器接口如下图:

java 控制器逻辑校验还是service校验 javaweb控制器_监听器


让监听器生效也很简单,只要实现上述相应的接口中的方法即可,并用
@WebListener标注实现类,或在部署描述符中使用listener元素。

2.过滤器

过滤器是指拦截请求,并对传给被请求资源的ServletRequest和ServletResponse进行处理的一个对象。过滤器可用于登录、加密和解密、会话检查、图片转换等等。过滤器可以配置为拦截一个或多个资源。

过滤器配置可以通过注解或部署描述符完成。如果同一个资源或同一组资源应用了多个过滤器,则其调用顺序有时候显得比较重要,这时候就需要用到部署描述符。

过滤器类必须实现javax.servlet.Filter接口,这个接口为每个过滤器暴露三个生命周期方法:init、doFilter、destroy.当应用程序启动之后,资源被请求之前,Servlet容器就会调用init方法,这个方法只调用一次,并且包含该过滤器的初始化代码:

void init(FilterConfig config)



每次调用与过滤器相关的资源时,Servlet容器都会调用filter实例的doFilter方法:

void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)


filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。


chain.doFilter(req,resp)


Filter中的最后一个生命周期是destroy,由Servlet容器调用,一般发生在应用程序停止的时候。除非一个过滤器类在部署描述符的多个filter元素进行了声明,否则Servlet容器将只给每一个过滤器创建一个实例。由于Web应用程序通常是多用户的应用程序,因此可以同时通过多个线程访问一个过滤器实例,但必须谨慎处理好多线程问题。