HelloFilter
package 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;
/**
* filter的基本概念
* Servlet过滤器,从字面意思理解经过一层过滤才能使用,过滤器是客户端与服务器响应之间的中间件,
* 在实际项目开发当中servlet过滤器主要用于对浏览器请求进行过滤处理。
* 特点:
* 声明式的:用过在web.xml配置文件中声明,允许添加删除过滤器,而无需改动任何应用程序代码或jsp页面。
* 灵活性的:过滤器可用于客户端的预处理和后期处理工作。
* 可移植性:一次开发,多处使用。
*
* 使用:
* 实现Filter接口,完成未完成的方法。
* <!-- 过滤器声明 -->
<filter>
<!-- 过滤名称 -->
<filter-name>HellloFilter</filter-name>
<!-- 过滤器完整类名 -->
<filter-class>filter.HellloFilter</filter-class>
<!-- 初始化参数 -->
<init-param>
<!-- 参数名 -->
<param-name>count</param-name>
<!-- 参数值 -->
<param-value>0</param-value>
</init-param>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>HellloFilter</filter-name>
<!-- 过滤的URL映射 -->
<url-pattern>/hello.jsp</url-pattern>
</filter-mapping>
*
*/
public class HellloFilter implements Filter{
//初始化方法
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
//过滤器处理方法
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
}
//摧毁方法
@Override
public void destroy() {
Filter.super.destroy();
}
}
CountFilter
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class CountFilter implements Filter{
private int count;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//访问量的初始数据
String param = filterConfig.getInitParameter("count");
count = Integer.valueOf(param);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//访问量增加
count++;
HttpServletRequest req = (HttpServletRequest) request;
//servlet的上下文
ServletContext context = req.getServletContext();
//上下文赋值
context.setAttribute("count", count);
//向下传递过滤器
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页面</title>
</head>
<body>
<h1>欢迎访问张三的博客</h1>
您是本站的第
<%= application.getAttribute("count")%>
位访客!
</body>
</html>
web.xml
<?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_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>FilterDemo</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>CountFilter</filter-name>
<!-- 过滤器完整类名 -->
<filter-class>filter.CountFilter</filter-class>
<!-- 初始化参数 -->
<init-param>
<!-- 参数名 -->
<param-name>count</param-name>
<!-- 参数值 -->
<param-value>0</param-value>
</init-param>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>CountFilter</filter-name>
<!-- 过滤的URL映射 -->
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
IpFilter
package web;
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;
//Servlet3.0之后的写法
@WebFilter(filterName = "IpFilter",urlPatterns = "*.jsp",
initParams= {@WebInitParam(name="ipTable",value="127.0.0.1,0:0:0:0:0:0:0:1,192.168.0.151")})
public class IpFilter implements Filter {
private String ipTable = null;
public void init(FilterConfig fConfig) throws ServletException {
//拿到黑名单 (放到缓存)
ipTable = fConfig.getInitParameter("ipTable");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//需要校验Ip地址
if(!vartfyIp(request,response)) {
return;
}
chain.doFilter(request, response);
}
public void destroy() {
}
private boolean vartfyIp(ServletRequest request, ServletResponse response) {
//拿到客户机ip
String ip = request.getRemoteAddr();
System.out.println("客户机IP"+ip);
System.out.println("黑名单IP"+ipTable);
if(ipTable.indexOf(ip) != -1) {
response.setContentType("text/html;charset=utf-8");
try {
//获取时间 毫秒
long time = System.currentTimeMillis();
response.getWriter().write("<h1 style='color:red;text-align:center;'>对不起,你号没了。"+time+"</h1>");
return false;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}else {//没有找到
return true;
}
}
}
最后修改于 2021-09-15 09:41:57
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

