二十三过滤器和监听器
1.过滤器
限制用户的处理请求或访问资源
-
过滤器
过滤器是以一种组件的形式绑定到WEB应用程序中,采用链的方式进行处理
-
实现
发起请求(处理请求或资源访问请求)
实现Filter接口
实现接口中方法
- public void intit(FilterConfig filterConfig)
- public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain fileterChain) - public void destroy()
配置web.xml文件
过滤器本质上是Servlet
FilterChain的作用是将用户的请求向下传递给其他过滤器或Servlet,形成一个过滤链
当Tomcat启动时,过滤器会自动加载并初始化,并对发起的请求进行过滤
1Filter
<form action="2FilterPage.jsp" method= "post" >
姓名: <input type="text" name="uname" />
<input type= "submit" value= "提交" />
</form>
</body>
S1102FileterListener.S1Filter
public class S1Filter implements Filter{
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("过滤器初始化");
String charEncoding=config.getInitParameter("charset");
System.out.println("字符编码:"+charEncoding);
}
@Override
public void doFilter(ServletRequest req, ServletResponse response,
FilterChain fileterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)req;
request.setCharacterEncoding("UTF-8");
System.out.println(request.getMethod());
System.out.println(request.getServletContext());
System.out.println(request.getServletPath());
System.out.println(request.getRequestURL());
System.out.println(request.getRealPath("/"));
String uname=request.getParameter("uname");
System.out.println("uname:"+uname);
fileterChain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
web.xml
<!-- 配置过滤器 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>S1102FileterListener.S1Filter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/1102FilterListener/*</url-pattern>
</filter-mapping>
2.监听器
负责监听WEB的操作,当相关事件触发之后将产生事件,可对request,session,application三种操作进行监听
实现步骤
-
实现相关监听器接口并实现接口抽象方法
-
配置该监听器的web.xml
-
application
-
ServletContextListener接口
触发接口中定义的事件,可通过ServletContextEvent进行事件处理
且不能监听application的属性
-
public void contextInitialized(ServletContextEvent sce)
-
public void contextDestroyed(ServletContextEvent sce)
触发事件,都会通过ServletContextEvent 对象处理,常用方法:
- public ServletContext getServletContext()
S1102FileterListener.S2ServletContextListener public class S2ServletContextListener implements ServletContextListener{ @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("ServletContextListener监听器销毁"); System.out.println("上下文路径:"+servletContextEvent.getServletContext().getRealPath("/")); } @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("ServletContextListener监听器初始化"); System.out.println("上下文路径:"+servletContextEvent.getServletContext().getContextPath()); }
web.xml <!-- 配置监听器 --> <listener> <listener-class>S1102FileterListener.S2ServletContextListener</listener-class> </listener>
-
-
ServletContextAttributelistener接口
监听application的属性操作,触发接口中定义的事件,可通过ServletContextEvent进行事件处理
-
public void attributeAdded(ServletContextAttributeEvent scab)
-
public void attributeRemoved(ServletContextAttributeEvent scab)
-
public void attributeReplaced(ServletContextAttributeEvent scab)
触发事件都会通过ServletContextAttributeEvent 对象处理,常用方法:
- public String getName()
- public Object getValue()
-
public class S3ServletContextAttributeListener implements ServletContextAttributeListener{ @Override public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) { System.out.println("添加的属性名:"+servletContextAttributeEvent.getName()+"\t属性值:"+servletContextAttributeEvent.getValue()); } @Override public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) { System.out.println("删除的属性名:"+servletContextAttributeEvent.getName()+"\t属性值:"+servletContextAttributeEvent.getValue()); } @Override public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) { System.out.println("修改的属性名:"+servletContextAttributeEvent.getName()+"\t属性值:"+servletContextAttributeEvent.getValue()); }
S3ServletContextListener.jsp <body> S3ServletContextListener <% //1.添加属性 application.setAttribute("myname", "老牛"); //2.修改属性 application.setAttribute("myname", "李四"); //3.移除属性 application.removeAttribute("myname"); %> </body>
web.xml <listener> <listener-class>S1102FileterListener.S3ServletContextAttributeListener</listener-class> </listener>
-
session
-
HttpSessionListener
对创建或销毁session操作进行监听
-
public void sessionCreated(HttpSessionEvent se)
-
public void sessionDestroyed(HttpSessionEvent se)
触发: HttpSession的 invalidate()方法
超过了配置的 session 超时时间
触发事件都会通过HttpSessionEvent 对象处理
常用方法:
1. public HttpSession getSession()
-
-
HttpSessionAttributeListener
对 session 的属性操作进行监听
-
public void attributeAdded(HttpSessionBindingEvent se)
-
public void attributeRemoved(HttpSessionBindingEvent se)
-
public void attributeReplaced(HttpSessionBindingEvent se)
触发事件都通过 HttpSessionBindingEvent 对象处理,常用方法:
1. public HttpSession getSession() 2. public String getName() 3. public Object getValue()
-
-
request
-
ServletRequestListener
对用户的每次请求进行监听
-
public void requestInitialized(ServletRequestEvent sre)
-
public void requestDestroyed(ServletRequestEvent sre)
触发事件都通过ServletRequestEvent 对象处理
常用方法:
- public ServletRequest getServletRequest()
- public ServletContext getServletContext()
-
-
ServletRequestAttributeListener
对request范围属性进行监听
-
public void attributeAdded(ServletRequestAttributeEvent srae)
-
public void attributeReplaced(ServletRequestAttributeEvent srae)
-
public void attributeRemoved(ServletRequestAttributeEvent srae)
触发事件都通过ServletRequestAttributeEvent 对象处理,常用方法:
- public String getName()
- public Object getValue()
-
-
-
-