Tomcat全局Filter例子

Tomcat全局Filter例子(RequestFilter)

                --ruphy

核心思想:将maven依赖的包以及自己写的Filter包复制到${tomcat_home}/lib下,并在${tomcat_home}/conf/web.xml文件里新增<filter>和<filter-map>标签,或者filter类使用WebFilter注解

 

Servlet3.0引入了注解,使用注解来定义Servlet和filter就可以不用配置web.xml文件

@WebFilter("/*") 和@WebServlet("/add") 是servlet3.0的新特性,在tomcat 6 下使用@WebFilter("/*") 和@WebServlet("/add")时提示出错,因为tomcat6没有这个属性

 

解决办法是:下载javax.servlet-api-3.0.1.jar并加载到项目的lib目录下

 

整体架构--不用纠结打包不成功,可以的话直接将编译后的类手动压缩包为zip文件,重命名为jar类型就可以,filter/lib下面的包是在import的地方idea提示自动导入的,WEB-INF/lib下面是maven依赖编译后生成的(需要复制到${tomcat_home}/lib下面)

 

 

 

maven文件 pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>me.muphy.tomcat</groupId>
  <artifactId>filter</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>filter Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.73</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.19</version>
    </dependency>


  </dependencies>

  <build>
    <finalName>filter</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

</project>
RequestFilter.java文件
package me.muphy.tomcat.filter;

import com.alibaba.fastjson.JSON;
import me.muphy.tomcat.filter.entity.ClientRequestInfo;
import me.muphy.tomcat.filter.service.RemoteHostService;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class RequestFilter implements Filter {

    public static void main(String[] args) {
        new RemoteHostService().SaveClientRequestInfo(new ClientRequestInfo("127", "/test"));
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if(!(servletRequest instanceof HttpServletRequest)){
            return;
        }
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        ClientRequestInfo clientRequestInfo = new ClientRequestInfo();
        clientRequestInfo.setCookie(JSON.toJSONString(request.getCookies()));
        clientRequestInfo.setHost(request.getRemoteHost());
        clientRequestInfo.setIp(request.getRemoteAddr());
        clientRequestInfo.setParameters(JSON.toJSONString(request.getParameterMap()));
        clientRequestInfo.setReferer(request.getHeader("referer"));
        clientRequestInfo.setQueryString(request.getQueryString());
        clientRequestInfo.setUser(request.getRemoteUser());
        clientRequestInfo.setMethod(request.getMethod());
        clientRequestInfo.setUrl(request.getRequestURI());
        RemoteHostService remoteHostService = new RemoteHostService();
        remoteHostService.SaveClientRequestInfo(clientRequestInfo);
        System.out.println(clientRequestInfo);
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
RemoteHostService.java文件
package me.muphy.tomcat.filter.service;

import me.muphy.tomcat.filter.entity.ClientRequestInfo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class RemoteHostService {
    public boolean SaveClientRequestInfo(ClientRequestInfo clientRequestInfo) {
        try {
            DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
            Connection conn = DriverManager.getConnection("jdbc:mysql://47.***.***.21/hacker", "azi", "***");
            PreparedStatement ps = conn.prepareStatement("insert into client_visit_info(ip, visit_info) values (?,?)");
            ps.setString(1, clientRequestInfo.getIp());
            ps.setString(2, clientRequestInfo.getVisitInfo());
            ps.execute();
            ps.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

}
ClientRequestInfo.java文件
package me.muphy.tomcat.filter.entity;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ClientRequestInfo implements Serializable {
    private String ip;
    private String cookie;
    private String parameters;
    private String method;
    private String url;
    private Date visitTime = new Date();

    public ClientRequestInfo() {

    }

    public ClientRequestInfo(String ip, String url) {
        this.ip = ip;
        this.url = url;
    }

    public String getVisitInfo() {
        return "{" +
                "ip:'" + ip + '\'' +
                ", cookie:'" + cookie + '\'' +
                ", parameters:'" + parameters + '\'' +
                ", method:'" + method + '\'' +
                ", url:'" + url + '\'' +
                ", visitTime:'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(visitTime) +
                "'}";
    }


    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getCookie() {
        return cookie;
    }

    public void setCookie(String cookie) {
        this.cookie = cookie;
    }

    public String getParameters() {
        return parameters;
    }

    public void setParameters(String parameters) {
        this.parameters = parameters;
    }

    public Date getVisitTime() {
        return visitTime;
    }

    public void setVisitTime(Date visitTime) {
        this.visitTime = visitTime;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public String getMethod() {
        return method;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUrl() {
        return url;
    }   
    

    @Override
    public String toString() {
        return getVisitInfo();
    }
}

${tomcat_home}/conf/web.xml配置文件的<web-app>节点里面新增如下配置(两个filter-name名字一样就可以)

    <!-- 访问过滤器-记录IP -->
    <filter>
        <filter-name>ruphyFilter</filter-name>
        <filter-class>
          me.muphy.tomcat.filter.RequestFilter
        </filter-class>
    </filter>
   <filter-mapping>
        <filter-name>ruphyFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

 

posted @ 2020-08-16 03:46  明月心~  阅读(769)  评论(0)    收藏  举报