Javaweb学习(四)之Filter过滤器 , 监听器

Javaweb学习(四)之Filter过滤器 , 监听器

1、Filter

1.1、什么是Filter过滤器

  • Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
  • Filter 过滤器它是 JavaEE 的规范。也就是接口
  • Filter 过滤器它的作用是:拦截请求,过滤响应

拦截请求常见的应用场景有:

  • 权限检查
  • 日记操作
  • 事务管理
  • 处理中文乱码
  • 登录验证….

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hy1v1lOn-1595424769258)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20200722204715105.png)]

1.2、Filter 的使用

Filtet代码

//继承Filter接口
public class CharacterEndoingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEndoingFilter开始初始化呢");
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //解决乱码问题
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        System.out.println("CharacterEndoingFilter方法开始前");
        //doFilter方法必须写,让我们的请求继续往下访问用户的目标资源
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEndoingFilter方法开始后");
    }

    public void destroy() {
        System.out.println("CharacterEndoingFilter方法被销毁呢");
    }
}

Servlet代码(因为在Filter过滤器中编写了解决中文乱码的问题 所以在 servlet代码中就不需要写呢! 这样使我们方便了许多 )

public class FilteServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("宋超");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>filteServlet</servlet-name>
        <servlet-class>com.song.servlet.FilteServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>filteServlet</servlet-name>
        <url-pattern>/servlet/show</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>filteServlet1</servlet-name>
        <servlet-class>com.song.servlet.FilteServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>filteServlet1</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>ShowFilter</filter-name>
        <filter-class>com.song.filter.CharacterEndoingFilter</filter-class>
    </filter>
    <!--只要是 /servlet的任何请求,都会经过这个过滤器 可以自己设置路径来过滤-->
    <filter-mapping>
        <filter-name>ShowFilter</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
</web-app>

Filter 过滤器的使用步骤:

1、编写一个类去实现 Filter 接口

2、实现过滤方法 doFilter()

3、到 web.xml 中去配置 Filter 的拦截路径

Filter 的拦截路径 -

  • -精确匹配

    <url-pattern>/target.jsp</url-pattern>

    /target.jsp 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

  • –目录匹配

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

    /admin/* 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

  • –后缀名匹配

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

    *.html 以上配置的路径,表示请求地址必须以.html 结尾才会拦截到

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

    *.do 以上配置的路径,表示请求地址必须以.do 结尾才会拦截到

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

    *.action 以上配置的路径,表示请求地址必须以.action 结尾才会拦截到 Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

2、监听器(可以只了解就行)

2.1、什么是监听器

监听器就是监听观察某个事件(程序)的发生情况,当被监听的事件真的发生了的时候,事件发生者(事件源) 就会给注册该事件的监听者(监听器)发送消息,告诉监听者某些信息,同时监听者也可以获得一份事件对象,根据这个对象可以获得相关属性和执行相关操作。

2.2、编写一个监听器

//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {

    //创建session监听: 看你的一举一动
    //一旦创建Session就会触发一次这个事件!
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();

        System.out.println(se.getSession().getId());

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount==null){
            onlineCount = new Integer(1);
        }else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count+1);
        }

        ctx.setAttribute("OnlineCount",onlineCount);

    }

    //销毁session监听
    //一旦销毁Session就会触发一次这个事件!
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount==null){
            onlineCount = new Integer(0);
        }else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count-1);
        }

        ctx.setAttribute("OnlineCount",onlineCount);

    }


    /*
    Session销毁:
    1. 手动销毁  getSession().invalidate();
    2. 自动销毁
     */
}

配置web.xml

<!--注册监听器-->
<listener>
    <listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>
1. 手动销毁  getSession().invalidate();
2. 自动销毁
 */

}


配置web.xml

```xml
<!--注册监听器-->
<listener>
    <listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>

推荐学习javaweb视频 B站:遇见狂神说 若写的有问题 欢迎纠正哦! 谢谢大家!

猜你喜欢

转载自blog.csdn.net/qq_44763720/article/details/107523854