Loading

过滤器

过滤器的基本使用

过滤器的介绍

过滤链

开发过滤器的三要素

第一个过滤器

package com.jesse.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;

public class MyFirstFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("过滤器已生效");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>first-filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- filter标签用于说明哪个类是过滤器,并且在应用启动时自动加载 -->
  <filter>
      <filter-name>MyFirstFilter</filter-name>
      <filter-class>com.jesse.filter.MyFirstFilter</filter-class>
  </filter>
  <!-- filter-mapping标签用于说明过滤器对 URL应用的范围,要点有二:
      1. filter-name 过滤器名称与filter.filter-name保持一致
      2. url-pattern 说明过滤器作用范围,/*代表对所有URL进行过滤
   -->
  <filter-mapping>
      <filter-name>MyFirstFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

过滤器的生命周期

过滤器的进阶

过滤器的两种开发方式

配置方式

注解方式

区别

字符集过滤器

package com.jesse.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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter(filterName="CharacterEncodingFilter", urlPatterns="/*")
public class CharacterEncodingFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest req = (HttpServletRequest)request;
        req.setCharacterEncoding("UTF-8");
        HttpServletResponse res = (HttpServletResponse)response;
        res.setContentType("text/html;charset=UTF-8");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}

ServletRequest接口与实现类

  • servlet-api.jar是J2EE定义的接口规范
  • catalina.jar是第三方厂商的具体实现

过滤器的参数化(配置和和注解)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>first-filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- filter标签用于说明哪个类是过滤器,并且在应用启动时自动加载 -->
  <filter>
      <filter-name>MyFirstFilter</filter-name>
      <filter-class>com.jesse.filter.MyFirstFilter</filter-class>
  </filter>
  
<!--     <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>com.jesse.filter.CharacterEncodingFilter</filter-class>
       <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
       <init-param>
          <param-name>p1</param-name>
          <param-value>v1</param-value>
      </init-param>
  </filter> -->
  
  <!-- filter-mapping标签用于说明过滤器对 URL应用的范围,要点有二:
      1. filter-name 过滤器名称与filter.filter-name保持一致
      2. url-pattern 说明过滤器作用范围,/*代表对所有URL进行过滤
   -->
  <filter-mapping>
      <filter-name>MyFirstFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  
<!--     <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping> -->
  
</web-app>
package com.jesse.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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter(filterName="CharacterEncodingFilter", urlPatterns="/*",
        initParams = {
                @WebInitParam(name = "encoding", value="UTF-8"),
                @WebInitParam(name = "p1", value="v1"),
        })
public class CharacterEncodingFilter implements Filter {
    private String encoding;
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest req = (HttpServletRequest)request;
        req.setCharacterEncoding(encoding);
        HttpServletResponse res = (HttpServletResponse)response;
        res.setContentType("text/html;charset=" + encoding);
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        encoding = filterConfig.getInitParameter("encoding");
        System.out.println("encoding : " + encoding );
    }

}

UrlPattern设置过滤范围

过滤链

注意事项

  • 每个过滤器应具有单独职能
  • 过滤器的执行顺序以filter-mapping为准
  • 注解方式下执行顺序以按过滤器类名升序依次执行
  • 调用chain.doFilger()将请求向后传递

Example

package com.jesse.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;
import javax.servlet.annotation.WebFilter;
//@WebFilter(filterName = "FilterA", urlPatterns = "/*")
public class FilterA implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("I'm Filter A");
        chain.doFilter(request, response);
        //System.out.println("I'm Filter A");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}
package com.jesse.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;

//@WebFilter(filterName = "FilterB", urlPatterns = "/*")
public class FilterB implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("I'm Filter B");
        chain.doFilter(request, response);
        //System.out.println("I'm Filter B");

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}
package com.jesse.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;
//@WebFilter(filterName = "FilterC", urlPatterns = "/*")
public class FilterC implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("I'm Filter C");
        chain.doFilter(request, response);
        //System.out.println("I'm Filter C");

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>filter-chain</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <filter>
      <filter-name>FilterA</filter-name>
      <filter-class>com.jesse.filter.FilterA</filter-class>
  </filter>
    <filter>
      <filter-name>FilterB</filter-name>
      <filter-class>com.jesse.filter.FilterB</filter-class>
  </filter>
    <filter>
      <filter-name>FilterC</filter-name>
      <filter-class>com.jesse.filter.FilterC</filter-class>
  </filter>
  
  <filter-mapping>
      <filter-name>FilterC</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
      <filter-name>FilterA</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
    <filter-mapping>
      <filter-name>FilterB</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>
package com.jesse.filter;

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

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

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

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().println("Hello World!");
        System.out.println("Hello World!");
    }

    /**
     * @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);
    }

}

案例:多端设备自动适配

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="" src="/images/desktop.jpg"/>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="" src="/images/mobile.jpg" style="width:100%" />
</body>
</html>
package com.jesse.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DeviceAdapterFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res =(HttpServletResponse)response;
        /*
         * /index.html
         * PC: /desktop/index.html
         * MOBILE: /mobile/index.html
         *
         *  /test.html
         *  PC: /desktop/test.html
         *  MOBILE: /mobile/test.html
         */
        String uri = req.getRequestURI();
        System.out.println("URI:"+ uri);
        if(uri.startsWith("/desktop") || uri.startsWith("/mobile")) {
            chain.doFilter(request, response);
        }else {
            String userAgent = req.getHeader("user-agent").toLowerCase();
            System.out.println(userAgent);
            String targetURI = "";
            if(userAgent.indexOf("android")!=-1 || userAgent.indexOf("iphone")!=-1) {
                targetURI = "/mobile" + uri;
                System.out.println("移动端设备正在访问,重新跳转URI:" + targetURI);
                res.sendRedirect(targetURI);
            }else {
                targetURI = "/desktop" + uri;
                System.out.println("PC端设备正在访问,重新跳转URI:" + targetURI);
                res.sendRedirect(targetURI);
            }
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>device-adapter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <filter>
      <filter-name>DeviceAdapterFilter</filter-name>
      <filter-class>com.jesse.filter.DeviceAdapterFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>DeviceAdapterFilter</filter-name>
      <url-pattern>*.html</url-pattern>
  </filter-mapping>
</web-app>
posted @ 2020-04-27 20:54  JesseKkk  阅读(276)  评论(0)    收藏  举报