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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇