java p41——Filter过滤器

tech2022-07-08  207

javaweb/day07|day08

Filter过滤器使用步骤要点FilterChain多个过滤器顺序FilterConfig获得初始化参数 功能-作用案例——自动登录实现案例——装饰者模式——解决乱码 Listener使用作用对象感知监听器

Filter过滤器

生命周期: 服务器启动创建 服务器关闭销毁

使用步骤

自定义类, 实现Filter接口重点实现doFilter方法注册Filter @WebFilter web.xml-配置]doFilter中, 直接响应, 要么放行 chain.doFilter测试: 发送的是Servlet请求 @WebFilter("/MyServlet01")//url-pattern代表要过滤的请求资源路径 public class MyFilterA implements Filter { public void destroy() { System.out.println("FilterA destroy"); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("MyFilterA before"); chain.doFilter(req, resp); System.out.println("MyFilterA after"); } public void init(FilterConfig config) throws ServletException { System.out.println("FilterA init"); } }

要点

FilterChain

FilterChain: 过滤器链, 由filter-mapping将过滤器连接串起来的 doFilter() -> 执行下一个过滤器, 本质是递归

@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

多个过滤器顺序

按照web.xml文件中的<filter-mapping>标签顺序

例DAC Demo01Servlet进来了 CAD

FilterConfig获得初始化参数

<filter> <filter-name>MyFilterC</filter-name> <filter-class>a_filter.MyFilterC</filter-class> <init-param>//初始化参数值 <param-name>driver</param-name> <param-value>com.mysql.cj.jdbc.Driver</param-value> </init-param> </filter> <filter-mapping> <filter-name>MyFilterC</filter-name> <url-pattern>/Demo01Servlet</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>

服务器一启动就会执行

public class MyFilterC implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 获得Filter的初始化参数 String driver = filterConfig.getInitParameter("driver"); System.out.println(driver); }

servlet中初始化参数

@WebServlet(value = "/Demo01Servlet", initParams = @WebInitParam(name="location", value="db.properties")) public class Demo01Servlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String location = getServletConfig().getInitParameter("location"); System.out.println(location); System.out.println("Demo01Servlet进来了"); MyFilterA before db.properties Demo01Servlet进来了 MyFilterA after

功能-作用

案例——自动登录实现

day07/com.zzxx. autoLogin

案例——装饰者模式——解决乱码

Listener

监听某个对象的的状态变化的组件。 监听三大域对象:

使用

自定义类实现Listener接口着重实现方法注册

重点:ServletContextListener 能监测到服务器的开启和关闭

@WebListener//注册 public class MyServletContextListener implements ServletContextListener { // 在ServletContext对象创建时调用 @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("application 创建了"); } // 检测到ServletContext对象的销毁,并且调用该方法 @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("application 销毁了"); } }

作用

初始化的工作:初始化对象、初始化数据 ---- 加载数据库驱动、连接池的初始化加载一些初始化的配置文件 — spring的配置文件任务调度----定时器----Timer/TimerTask

对象感知监听器

1.将对象存储在session中和将对象从session中移除 2.session对象的钝化, 活化 在服务器关闭时, session没有消失, 持久化在磁盘上 tomcat/work/Catalina/localhost/…/web08/SESSIONS.ser 将session数据持久化到磁盘上 -> session钝化 将磁盘上的session文件恢复到内存中 -> session活化

String name -> 可以保存在磁盘上 User user -> 不能保存在磁盘上, 不能序列化, 需要实现Serializable接口

设置session钝化时间:

<Context docBase="/Users/bonnie/IdeaWorks/javaweb/out/artifacts/web08_war_exploded"> <!-- maxIdleSwap:session中的对象多长时间不使用就钝化 --> <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下,配置钝化的对象文件在 work/catalina/localhost/钝化文件 --> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="bonnie" /> </Manager> </Context>
最新回复(0)