目录
过滤器
一、过滤器的概述
java过滤器能够对目标资源的请求和响应进行过滤/拦截。
javaweb 三大组件:servlet , filter , listener
生活中:净水器,空气净化器。。。
java中:登录验证,字符编码处理,敏感字符过滤等
共性特点:过滤的是每一次的请求和响应,意味着每一次的请求和响应一定要先走过滤器!
二、作用
一般用于完成通过的操作。如:登录过滤,编码处理,敏感字符过滤等。
三、过滤器的原理
四、快速入门
javaWeb三大组件:servlet (应用程序) , filter (过滤器), listener(监听器)
3.1 实现接口Filter
3.2 复写方法 chain.doFilter(req,resp);放行方法
3.3 配置访问拦截路径
注解配置
web.xml配置
<filter>
<filter-name>Filter</filter-name>
<filter-class>com.wjk.filter.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/LifeServlet</url-pattern>
</filter-mapping>
五、过滤器的细节问题
web.xml的配置
过滤器的执行流程
客户端发出请求----》过滤器----》放行-----》请求的资源----》响应----》过滤器----》客户端
过滤器的生命周期
同servlet生命周期:
init():初始化
doFilter():放行方法
destroy():销毁方法 当服务器正常关闭时,执行。
过滤器配置详解
- 过滤路径配置
- 具体的资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录:/user/* 访问user目录下的所有资源时,过滤器会被执行
- 后缀名拦截:*.jsp / *.do 访问所有后缀名为.jsp .do时,过滤器会被执行
- 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
- 过滤方式配置(资源被访问的方式) 了解
- 注解:设置dispatcherTypes属性
- REQUEST:默认值 浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
web.xml配置
<filter> <filter-name>FilterDemo1</filter-name> <filter-class>com.aaa.bai.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>FilterDemo1</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
监听器
一、监听器的作用
监听你的web应用,监听许多信息的初始化,销毁,增加,修改,删除值等
Servlet
监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理
二、监听器的分类
在一个web应用程序的整个运行周期内,web容器会创建和销毁三个重要的对象,
ServletContext
,HttpSession
,ServletRequest
按监听的对象划分,可以分为:
*ServletContext对象监听器
*HttpSession对象监听器
*ServletRequest对象监听器
按监听的时间划分
*对象自身的创建和销毁的监听器
*对象中属性的创建和消除的监听器
*sessoin中某个对象的状态变化的监听器
三、创建监听器的步骤
注册监听器:
<listener>
<listener-class>com.wjk.listener.Listener</listener-class>
</listener>
3.1 上下文监听
@WebListener
public class MyContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 获取到上下文对象
ServletContext application = servletContextEvent.getServletContext();
System.out.println("上下文初始化"+application);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("上下文销毁");
}
}
3.2 session监听
@WebListener
public class MySessionListener implements HttpSessionListener {
/**
*
* @param httpSessionEvent 事件参数,可以获取到被监听对象的数据信息
*/
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session创建"+httpSessionEvent.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session销毁"+httpSessionEvent.getSession());
}
}
3.3 session中属性监听
@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session属性添加:"+httpSessionBindingEvent.getName());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session属性移除:"+httpSessionBindingEvent.getName());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session属性替换:"+httpSessionBindingEvent.getName());
}
}
示例1:
在线人数统计:
1、先获取容器中的数量计数器,如果没有,创建存进去
2、每创建一个session,计数器加1
3、每销毁一个session,计数器减1
@WebListener
public class OnlineListener implements ServletContextListener, HttpSessionListener {
ServletContext appliction;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 获取上下文对象
appliction = servletContextEvent.getServletContext();
// 是否有计数器
if(appliction.getAttribute("count")==null){
// 存进去,只执行一次
appliction.setAttribute("count",0);
}
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
// 获取原来的计数器的值
Integer count=Integer.valueOf(appliction.getAttribute("count").toString());
count++;
// 存进去
appliction.setAttribute("count",count);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
Integer count=Integer.valueOf(appliction.getAttribute("count").toString());
count--;
appliction.setAttribute("count",count);
}
}