• servlet过滤器与监听器


     

    1.运行环境

    jdk1.8.0_77 Intellij IDEA2018.3 x64

    2.过滤器

    过滤器Filter

    过滤器是Servlet中最令人激动的特性之一,当浏览器发送请求给服务器时,服务器会先执行过滤器,然后才访问web资源。服务器响应请求,在web资源抵达浏览器之前,也会途径过滤器。
    过滤器可以做什么

    你可以把过滤器想象成一张过滤网,服务器与浏览器的信息交互都要经过过滤器以保证满足标准。使用过滤器可以过滤一些敏感字符串,可以避免中文乱码,可以进行权限验证(比如规定只有带session和cookie的浏览器才可以访问资源)等等。
    过滤器的出现使得一些棘手的问题得以解决,最通俗的体现就在于处理中文乱码,我们都知道,只有使用utf-8编码才能使得全世界各地的字符得以正确显示。不使用过滤器的话我们就需要在所有的servlet和jsp中对编码加以声明,代码的重复率相当高。
    过滤器示例——处理中文乱码

    只要java类实现了Filter接口就可以成为过滤器。
    一个标准的过滤器:

    新建Servlet实现Filter接口,重写其方法:

    package com.xx.filter;

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;

    // 实现Filter接口就可以称之为过滤器
    public class EncodingFilter implements Filter {
    // 构造方法
    public EncodingFilter() {
    // TODO Auto-generated constructor stub
    }

    // 销毁方法,与Servlet中的destory方法类似
    public void destroy() {
    // TODO Auto-generated method stub
    }

    // doFilter方法,在这里实现过滤器功能
    // 它有三个参数(ServletRequest,ServletResponse,FilterChain)
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    // 我们把处理中文乱码的代码放在这里就可以了
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");

    // pass the request along the filter chain
    // 在Java中使用了链式结构来管理过滤器。把所有的过滤器都放在FilterChain里边
    // 如果符合条件,就执行下一个过滤器(如果没有过滤器了,就执行目标资源)。
    chain.doFilter(request, response);
    }

    // 初始化方法,和destory方法都只执行一次
    public void init(FilterConfig fConfig) throws ServletException {
    // TODO Auto-generated method stub
    }

    }

    3.监听器

    监听器Listener

    监听器其实就是一个实现了特定接口普通java程序,这个程序专门用来监听一个java对象的方法调用或者属性改变,当被监听的对象的事件发生后,监听器就会立即捕捉到,并做以响应的处理。
    我们把被监听的对象称作事件源。在Servlet规范中定义了多种类型的监听器,我们可以使用监听器来监听 ServletContext,HttpSession和HttpServletRequest这三个作用域对象。监听的内容分为:监听域对象的创建和销毁,监听域对象的属性变化
    ServletContext HttpSession HttpServletRequest
    域对象的创建和销毁 ServeltContextListener HttpSessionListener ServeltRequestListener
    域对象属性的变化 ServeltContextAttributeListener HttpSessionAttributeListener ServeltRequestAttributeListener

    我们可以根据实际要求去实现不同的接口以监听目标事件源。

    监听器的部署,写在web.xml文件当中:

    <listener>
    <listener-class>com.xx.listener.CountOnlineUserListener</listener-class>
    </listener>

    1
    2
    3

    监听器示例——统计在线人数

    我们先来新建一个简单的登录页面:

    <html>
    <head>
    <meta charset="UTF-8">
    <style type="text/css">
    body{text-align:center;}
    span{ color:red; font-size:200% }
    hr{ margin-bottom:30px }
    </style>
    </head>
    <body>
    <span> 登录 </span>
    <hr color="red"/>
    <form action="LoginServlet" method="post">
    <table border="1" bordercolor="blue" width="40%" cellspacing="0" align="center">
    <tr>
    <td>用户名:</td>
    <td><input type="text" name="username"/></td>
    </tr>
    <tr>
    <td>密码:</td>
    <td><input type="password" name="password"/></td>
    </tr>
    <tr align="center">
    <td colspan="2">
    <input type="submit" value="登陆"/> <input type="reset" value="重置"/>
    </td>
    </tr>
    </table>
    </form>
    </body>
    </html>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    看下效果:
    在这里插入图片描述
    现在来新建LoginServlet:

    package com.xx.servlet;

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    /**
    * Servlet implementation class LoginServlet
    */
    public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
    * @see HttpServlet#HttpServlet()
    */
    public LoginServlet() {
    super();
    // TODO Auto-generated constructor stub
    }

    /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
    * response)
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    // 模拟登陆后在首页显示当前在线人数
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    // 拿到用户输入的用户名和密码后,我们自然是拿去和数据库中的数据做校验
    // 我们假设校验成功,然后跳转到首页页面
    response.sendRedirect("IndexServlet");
    }

    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
    * response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
    }

    }

    4.心得

    做项目和生活一样

    一定要有条有序

    有头有尾

    才能完成

  • 相关阅读:
    9ch
    thymeleaf 的使用(三)--举例使用
    thymeleaf 的使用(二)--基本语法
    thymeleaf 的使用(一)--导入和基本操作
    SpringBoot对静态资源的映射规则
    第一个Spring Boot项目
    HTML文本换行问题
    判断for(var i=0;i<=3;i++){ setTimeout(function() { console.log(i) }, 10) }
    js的执行机制——宏任务和微任务
    v-if 和 v-show 的区别
  • 原文地址:https://www.cnblogs.com/nanren/p/13662044.html
Copyright © 2020-2023  润新知