Servlet学习笔记-监听器和过滤器

    技术2022-07-10  84

    Listener(监听器)

    介绍

    一组来自Servlet规范下的接口,共有八个接口。在Tomcat存在servlet.apt.jar 监听器接口需要开发人员亲自实现。 监听器接口用于监控“作用域对象生命周期变化时刻”和“作用域对象中的共享数据的变化"。

    监听器接口实现类的开发步骤

    三步 a.根据监听的实际情况,选择对应监听器接口进行实现 b.重写监听器接口声明“监听事件处理方法” c.在web.xml文件将监听器接口实现类注册到Http服务器

    <listener> <listener-class>xxx.xxx.OneListener</listener-class> </listener>

    关于ServletContextListener接口

    作用: 通过这个接口,可以合法检测全局作用域对象被初始化、销毁的时刻。

    监听事件处理方法: public void contextInitlized():全局作用域对象初始化时调用 public void contextDesory():全局作用域对象销毁时调用

    代码实例:

    public class OneListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("全局作用域对象被创建"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("全局作用域对象被销毁"); } }

    关于ServletContextAttributeListener接口

    作用: 通过这个接口,可以合法检测全局作用域对象中共享数据的变化时刻。

    监听事件处理方法: public void contextAdd():全局作用域对象添加共享数据时调用 public void contextReplace():全局作用域对象更新共享数据时调用 public void contextRemove():全局作用域对象删除共享数据时调用

    Filter接口(过滤器接口)

    介绍

    来自Servlet规范下的接口。在Tomcat存在servlet.api.jar Filter接口实现类由开发人员亲自实现。 Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截。

    作用

    拦截Http服务器,帮助Http服务器检测当前请求的合法性。 拦截Http服务器,对当前请求进行增强操作。

    Filter接口实现类开发步骤

    三步: a.创建一个Java类,实现Filter接口 b.重写Filter接口中doFilter()方法 c.在web.xml文件将过滤器接口实现类注册到Http服务器

    <!--将过滤器文件路径交给Tomcat--> <filter> <filter-name>OneFilter</finter-name> <filter-class>xxx.xxx.OneFilter</filter-class> </filter> <!--通知Tomcat在调用何种资源文件时需要被当前过滤器拦截--> <filter-mapping> <filter-name>OneFilter</filter-name> <url-pattern>/xxx.html</url-pattern> </filter-mapping>

    Filter拦截调用文件的规则

    具体文件:

    <url-pattern>/xxx.html</url-pattern>

    某个文件夹下的所有文件:

    <url-pattern>/img/*</url-pattern>

    某种类型的所有文件:

    <url-pattern>/*.jpg</url-pattern>

    任意文件:

    <url-pattern>/*</url-pattern>

    代码实例: index.html

    <body> <center> <form action="index2.html"> 年龄:<input type="text" name="age"><br> <input type="submit" value="提交"> </form> </center> </body>

    index2.html

    <body> 欢迎进入 </body>

    对index2.html进行拦截

    <filter> <filter-name>OneFilter</filter-name> <filter-class>filter.OneFilter</filter-class> </filter> <filter-mapping> <filter-name>OneFilter</filter-name> <url-pattern>/index2.html</url-pattern> </filter-mapping>

    Filter接口实现类

    public class OneFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //1.通过拦截请求对象得到请求包中参数信息,从而得到来访用户真实年龄 String age=servletRequest.getParameter("age"); //2.根据年龄,帮助Http服务器判断本次请求合法性 if(Integer.valueOf(age)<70){ //将拦截的对象交给Tomcat filterChain.doFilter(servletRequest,servletResponse); }else{ //过滤器代替Http服务器拒绝本次请求 servletResponse.setContentType("text/html;charset=utf-8"); PrintWriter out=servletResponse.getWriter(); out.print("<center><font>您的年龄不合法,禁止访问</font></center>"); } } }

    监听器可以在一定程度上限制用户对服务器的资源文件的访问,比如:用户直接在url地址栏填写访问资源文件地址。 可以对其进行限制。 利用Session(会话作用域对象) request.getSession(false);限制用户访问。

    代码实例: 用户登录Servlet(部分)

    //调用响应对象,根据验证结果将不同的资源文件地址写入响应头,交给浏览器 if(result==1){ //当前用户登录时,对其创建一个session HttpSession session=request.getSession(); response.sendRedirect("/myWeb5/index.html"); }else { response.sendRedirect("/myWeb5/login_error.html"); }

    利用过滤器对其拦截

    public class OneFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)servletRequest; HttpSession session=null; String uri=request.getRequestURI(); //访问登录页面或者主页时,对其开放。 if(uri.indexOf("login")!=-1||"/myWeb5/".equals(uri)){ filterChain.doFilter(servletRequest,servletResponse); return; } //如果当前用户已有session则对其开放 session=request.getSession(false); if(session!=null){ filterChain.doFilter(servletRequest,servletResponse); return; } //没有session,拒绝请求 request.getRequestDispatcher("/login_error.html").forward(servletRequest,servletResponse); } }
    Processed: 0.014, SQL: 9