溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringMVC中怎么利用攔截器實(shí)現(xiàn)IP黑名單功能

發(fā)布時間:2021-08-09 16:45:53 來源:億速云 閱讀:299 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)SpringMVC中怎么利用攔截器實(shí)現(xiàn)IP黑名單功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

1.配置攔截器

這里使用全局?jǐn)r截:

<mvc:interceptors>   <mvc:interceptor>     <mvc:mapping path="/**"/>     <bean class="com.nps.base.filter.LoginInterceptor"></bean>   </mvc:interceptor></mvc:interceptors>

攔截器LoginInterceptor代碼:

package com.nps.base.filter;import java.io.IOException;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import com.nps.utils.IpInterceptUtils; /** * 驗(yàn)證攔截器 * @author HUANG */public class LoginInterceptor implements HandlerInterceptor {private final static Logger logger = LoggerFactory .getLogger(LoginInterceptor.class);@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {}@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String ip = getIpAddress(request); if (IpInterceptUtils.chickIpBreak(ip)) { return false; } Map<String, String> map = getParameterMap(request);// 獲取url中的所有參數(shù) String servletUrl = request.getServletPath();// servlet地址 String url = getRealUrl(servletUrl, map); if (url.indexOf("/user/") == 0) { Object user = request.getSession().getAttribute("User"); if (user == null) {  // System.out.println("尚未登錄,調(diào)到登錄頁面");  response.sendRedirect(request.getContextPath() + "/loginOut.do");  return false; } } return true;}/** * 獲取請求主機(jī)IP地址,如果通過代理進(jìn)來,則透過防火墻獲取真實(shí)IP地址; *  * @param request * @return * @throws IOException */public final static String getIpAddress(HttpServletRequest request) throws IOException { // 獲取請求主機(jī)IP地址,如果通過代理進(jìn)來,則透過防火墻獲取真實(shí)IP地址 String ip = request.getHeader("X-Forwarded-For"); // if (logger.isInfoEnabled()) { // logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" // + ip); // } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { if (ip == null || ip.length() == 0  || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("Proxy-Client-IP");  // if (logger.isInfoEnabled()) {  // logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip="  // + ip);  // } } if (ip == null || ip.length() == 0  || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("WL-Proxy-Client-IP");  // if (logger.isInfoEnabled()) {  // logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip="  // + ip);  // } } if (ip == null || ip.length() == 0  || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("HTTP_CLIENT_IP");  // if (logger.isInfoEnabled()) {  // logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip="  // + ip);  // } } if (ip == null || ip.length() == 0  || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("HTTP_X_FORWARDED_FOR");  // if (logger.isInfoEnabled()) {  // logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip="  // + ip);  // } } if (ip == null || ip.length() == 0  || "unknown".equalsIgnoreCase(ip)) {  ip = request.getRemoteAddr();  // if (logger.isInfoEnabled()) {  // logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip="  // + ip);  // } } } else if (ip.length() > 15) { String[] ips = ip.split(","); for (int index = 0; index < ips.length; index++) {  String strIp = (String) ips[index];  if (!("unknown".equalsIgnoreCase(strIp))) {  ip = strIp;  break;  } } } return ip;}/** * 根據(jù)request獲取所有的參數(shù)集 *  * @param request * @return */protected Map<String, String> getParameterMap(HttpServletRequest request) { Enumeration<String> names = request.getParameterNames(); String name; Map<String, String> map = new HashMap<String, String>(); while (names.hasMoreElements()) { name = names.nextElement(); map.put(name, request.getParameter(name).trim().replaceAll("'", "")); } return map;}/** * 獲取url *  * @param uri * @param params * @return */String getRealUrl(String uri, Map<String, String> params) { StringBuffer sb = new StringBuffer(uri); if (params != null) { int i = 0; for (String key : params.keySet()) {  i++;  if (i == 1) {  sb.append("?" + key + "=" + params.get(key));  } else {  sb.append("&" + key + "=" + params.get(key));  } } } return sb.toString();}}

2.校驗(yàn)IP工具

public class IpInterceptUtils {private static String date ;private static PropertiesUtil p=null; /***  * 校驗(yàn)IP是否加入黑名單  * @param ip  * @return true 是在黑名單   * @throws IOException  */ public static boolean chickIpBreak(String ip) throws IOException{  if(p == null){   p = new PropertiesUtil("conf/ip-black.properties");  }else{   String str = new SimpleDateFormat("MMddHHmmss").format(new Date());    str=str.substring(0,9);   if(date==null || !date.equals(str)){    date = str;    p = new PropertiesUtil("conf/ip-black.properties");   }  }     Enumeration en = p.getProps().propertyNames();     while (en.hasMoreElements()) {       String key = (String) en.nextElement();       if(key.equals(ip)){        return true;       }     }  return false; }}

3.配置文件讀取類

PropertiesUtil

package com.nps.base.model;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import java.util.Properties;import org.springframework.stereotype.Component;/** * 讀取Properties綜合類,默認(rèn)綁定到classpath下的config.properties文件。 * @author  */@Component("PropertiesUtil")public class PropertiesUtil {  //配置文件的路徑  private String configPath=null;    /**   * 配置文件對象   */  private Properties props=null;    /**   * 默認(rèn)構(gòu)造函數(shù),用于sh運(yùn)行,自動找到classpath下的config.properties。   */  public PropertiesUtil() throws IOException{   if(props==null){    InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream("conf/application.properties");     props = new Properties();     props.load(in);       //關(guān)閉資源     in.close();   }      }    /**   * 默認(rèn)構(gòu)造函數(shù),用于sh運(yùn)行,自動找到classpath下的config.properties。   */  public PropertiesUtil(String path) throws IOException{   if(props==null){    InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(path);     props = new Properties();     props.load(in);       //關(guān)閉資源     in.close();   }      }    /**   * 根據(jù)key值讀取配置的值   * Jun 26, 2010 9:15:43 PM   * @author 朱志杰   * @param key key值   * @return key 鍵對應(yīng)的值    * @throws IOException    */  public String readValue(String key) throws IOException {    return props.getProperty(key);  }    /**   * 讀取properties的全部信息   * @throws FileNotFoundException 配置文件沒有找到   * @throws IOException 關(guān)閉資源文件,或者加載配置文件錯誤   *    */  public Map<String,String> readAllProperties() throws FileNotFoundException,IOException {    //保存所有的鍵值    Map<String,String> map=new HashMap<String,String>();    Enumeration en = props.propertyNames();    while (en.hasMoreElements()) {      String key = (String) en.nextElement();      String Property = props.getProperty(key);      map.put(key, Property);    }    return map;  }  /**   * 設(shè)置某個key的值,并保存至文件。   * @param key key值   * @return key 鍵對應(yīng)的值    * @throws IOException    */  public void setValue(String key,String value) throws IOException {    Properties prop = new Properties();    InputStream fis = new FileInputStream(this.configPath);    // 從輸入流中讀取屬性列表(鍵和元素對)    prop.load(fis);    // 調(diào)用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。    // 強(qiáng)制要求為屬性的鍵和值使用字符串。返回值是 Hashtable 調(diào)用 put 的結(jié)果。    OutputStream fos = new FileOutputStream(this.configPath);    prop.setProperty(key, value);    // 以適合使用 load 方法加載到 Properties 表中的格式,    // 將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流    prop.store(fos,"last update");    //關(guān)閉文件    fis.close();    fos.close();  }    /** * @return the props */ public Properties getProps() { return props; } public static void main(String[] args) {    PropertiesUtil p;    try {      p = new PropertiesUtil("conf/ip-black.properties");      Enumeration en = p.props.propertyNames();      String str="";      while (en.hasMoreElements()) {        String key = (String) en.nextElement();        System.out.println(key);      }    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  } }

附上黑名單IP文件格式

ip-black.properties 配置文件

45.119.99.35103.253.2.165157.65.166.51202.57.55.242119.82.252.122140.227.53.126140.227.211.20140.227.208.20116.253.84.183

關(guān)于SpringMVC中怎么利用攔截器實(shí)現(xiàn)IP黑名單功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI