zoukankan      html  css  js  c++  java
  • Javaweb学习之过滤器(Filter)的使用

    概念

    过滤器就是对web资源进行拦截,进行一些处理后再交给下一个过滤器或servlet,甚至直接交给客户端或服务器;可以拦截request进行处理的,也可以对返回的response进行拦截后处理。并且一个请求或一个响应都可以经过多层过滤器,如下图所示:

    用途

    • 自动登录

    • 设置统一的编码格式,避免乱码

    • 访问权限的控制

    • 进行敏感字符过滤(如经常遇到的不文明发言被过滤或者以“*”的形式显示出来)

      ......

    示例

    这里以一个servlet和一个filter作为示例。

    servlet作为请求,向浏览器写入一串中文字符,发生乱码是意料之中的事情:

    package servlet;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    public class show extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    /*        resp.setContentType("text/html;charset=utf-8");
            resp.setCharacterEncoding("UTF-8");*/
            resp.getWriter().write("好久不见,你还好吗?");
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }

    servlet的注册:

    <servlet>
        <servlet-name>show</servlet-name>
        <servlet-class>servlet.show</servlet-class>
    </servlet><servlet-mapping>
        <servlet-name>show</servlet-name>
        <url-pattern>/servlet/show</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>show</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>

    这里设置两个路径是为了方便测试过滤器是否起作用。下面的过滤器注册的路径是/servlet/*,意味着/servlet路径下面的页面才能实现过滤器。

    当然,上述的servlet可以使用代码中被注释掉的部分进行编码的设置,防止乱码的发生。但此种方法需要无意义地重复,不推荐使用。而过滤器就可以完成这项工作。

    使用步骤

    • 新建一个类,实现Filter接口

    • 重写三个方法

    • 在web.xml中注册(或使用注解)

    需要重写的三个方法的作用:

    void init(FilterConfig var1) throws ServletException; //过滤器初始化,在服务器启动时就自动执行了。

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; //过滤器的主体部分,过滤的代码在这里编写。

    void destroy(); //过滤器的销毁,在服务器关闭时实现。

    package filter;
    import javax.servlet.*;
    import java.io.IOException;
    public class Encode implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("Filter 初始化");
        }
        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("过滤器执行前");
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println("过滤器执行后");
        }
        public void destroy() {
            System.out.println("Filter 已被销毁");
        }
    }

    最后是注册,完成后即可使用:

    <filter>
        <filter-name>Encode</filter-name>
        <filter-class>filter.Encode</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Encode</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
  • 相关阅读:
    Linux2.6X内核中文件相关结构体总结
    Linux 内核文件系统与设备操作流程分析
    在linux下删除的共享文件怎么恢复
    fedora17的U盘安装和硬盘安装
    cakephp
    【25.00%】【vijos P1907】飞扬的小鸟
    【14.36%】【codeforces 614C】Peter and Snow Blower
    【14.67%】【codeforces 615D】Multipliers
    【records】10.24..10.30
    【非常高%】【codeforces 733A】Grasshopper And the String
  • 原文地址:https://www.cnblogs.com/awong18/p/13389499.html
Copyright © 2011-2022 走看看