ip白名单实现java

ip白名单设置

package com.dbapp.eapp.filter;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 * Title: MyConfig
 * Description:
 * 自定义配置文件
 * Version:1.0.0
 *
 * @author pancm
 * @date 2018年1月20日
 */

@Component//使用@Configuration也可以  
//@ConfigurationProperties(prefix = "application")//前缀
//@PropertySource(value = "classpath:application.properties")//配置文件路径  在resource目录下
//@PropertySource(value = "file:/home/app/eapp/eapp-api-backstage/ipconfig.properties")//配置文件路径  在当前目录下
@PropertySource(value = "file:\\E:\\ipconfig.properties")//配置文件路径  在当前目录下
public class IpConfig {

	@Value("${ipWhiteList}")//需要使用@value注解来注入,否则是null
	private String ipWhiteList;

	/**
	 * 获取ipWhiteList
	 *
	 * @return ipWhiteList
	 */
	public String getIpWhiteList() {
		return ipWhiteList;
	}

	/**
	 * 设置ipWhiteList
	 *
	 */
	public void setIpWhiteList(String ipWhiteList) {
		this.ipWhiteList = ipWhiteList;
	}


}  

package com.dbapp.eapp.filter;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Configuration
public class WhiteIPInterceptor extends WebMvcConfigurerAdapter {

	private static final Logger logger = LoggerFactory.getLogger(WhiteIPInterceptor.class);
	@Bean
	public HandlerInterceptor getMyInterceptor() {
		return new MyInterceptor();
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// addPathPatterns 用于添加拦截规则, 这里假设拦截 /url 后面的全部链接
		// excludePathPatterns 用户排除拦截
		registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");
		super.addInterceptors(registry);
	}


	class MyInterceptor implements HandlerInterceptor {

		@Autowired
		private IpConfig ipconfig;

		/**
		 * 在请求处理之前进行调用(Controller方法调用之前)调用,
		 * 返回true 则放行, false 则将直接跳出方法
		 */
		@Override
		public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
			String ip = getIpAddr(request);
			// 获取可以访问系统的白名单
			String ipStr = readToString("E:\\ipconfig.properties");
//			String ipStr = ipconfig.getIpWhiteList();
			String[] ipArr = ipStr.split("\\|");
			List<String> ipList = Arrays.asList(ipArr);
			if (ipList.contains(ip)) {
				return true;
			} else {
				logger.info("该IP: " + ip + "不通过,不在白名单内!");
				response.setCharacterEncoding("UTF-8");
				response.setContentType("application/json; charset=utf-8");
				// 消息
				Map<String, Object> messageMap = new HashMap<>();
				messageMap.put("status", "404");
				messageMap.put("message", "您好,ip为" + ip + ",暂时没有访问权限,请联系管理员开通访问权限。");
				ObjectMapper objectMapper = new ObjectMapper();
				String writeValueAsString = objectMapper.writeValueAsString(messageMap);
				response.getWriter().write(writeValueAsString);
				return false;
			}
		}

		/**
		 * 获取访问的ip地址
		 *
		 * @param request
		 * @return
		 */
		public String getIpAddr(HttpServletRequest request) {
			String ip = request.getHeader("X-Forwarded-For");
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("Proxy-Client-IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("WL-Proxy-Client-IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_CLIENT_IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_X_FORWARDED_FOR");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getRemoteAddr();
			}
			return ip;
		}

		public  String readToString(String fileName) {
			String encoding = "UTF-8";
			File file = new File(fileName);
			Long filelength = file.length();
			byte[] filecontent = new byte[filelength.intValue()];
			try {
				FileInputStream in = new FileInputStream(file);
				in.read(filecontent);
				in.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				return new String(filecontent, encoding);
			} catch (UnsupportedEncodingException e) {
				System.err.println("The OS does not support " + encoding);
				e.printStackTrace();
				return null;
			}
		}
		//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
		@Override
		public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//			System.out.println("postHandle被调用");
		}

		//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
		@Override
		public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//			System.out.println("afterCompletion被调用");
		}

	}




}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 IP 白名单功能,可以使用 Java 中的过滤器(Filter)。以下是一个简单的 IP 白名单过滤器示例代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class IPFilter implements Filter { private List<String> whiteList = new ArrayList<>(); @Override public void init(FilterConfig filterConfig) throws ServletException { // 读取白名单列表 String ips = filterConfig.getInitParameter("whiteList"); String[] ipArray = ips.split(","); for (String ip : ipArray) { whiteList.add(ip.trim()); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String remoteAddr = httpRequest.getRemoteAddr(); if (whiteList.contains(remoteAddr)) { // IP白名单中,放行 chain.doFilter(request, response); } else { // IP 不在白名单中,返回 403 Forbidden 状态码 HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); } } @Override public void destroy() { // do nothing } } ``` 在 web.xml 中配置过滤器: ```xml <filter> <filter-name>IPFilter</filter-name> <filter-class>com.example.IPFilter</filter-class> <init-param> <param-name>whiteList</param-name> <param-value>127.0.0.1,192.168.0.1</param-value> </init-param> </filter> <filter-mapping> <filter-name>IPFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 在 init-param 中配置白名单列表,多个 IP 用逗号分隔。该示例中只是简单的判断 IP 是否在白名单中,实际应用中可以根据需要进行更复杂的判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值