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>
  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/awong18/p/13389499.html
Copyright © 2011-2022 走看看