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>
浙公网安备 33010602011771号