通过springboot中ResponseBodyAdvice接口拦截URL以及返回data的拦截

package com.huaN.listener;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import com.alibaba.fastjson.JSONObject;
import com.huaN.entity.OperateLog;
import com.huaN.mapper.QualityMapper;

@ControllerAdvice
public class HnLogAnalysis implements ResponseBodyAdvice{
	@Autowired
    private QualityMapper qualityMapper;
	   @Override
	    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
           //每次项目访问任何一个接口时都会被拦截到这来来
	        String requestPath = request.getURI().getPath();
	        String url = request.getURI().toString();
	       //获取指定访问接口的返回值
	        if(requestPath!=null){
				//通过RequestContextHolder获取request
	            HttpServletRequest httpServletRequest = 
	                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

	            HttpSession httpSession = httpServletRequest.getSession(true);
	            httpSession.setAttribute("body", body);
	           String body1 =  JSONObject.toJSON(body).toString();
	          //  requestPath = request.getQueryString() == null ? uri : (uri + "?" + request.getQueryString());
	            //System.out.println("请求URl::: "+url);
                //System.out.println("返回值JSON::: "+body);
               String usernum =  getTelnum(url);
                //System.out.println("使用user::: "+usernum);
                OperateLog log = new  OperateLog();
              String[] result =  body1.toString().split(",");
              try {
                  if(result.length>2) {
                	  JSONObject  json1 = JSONObject.parseObject(result[0]+"}");
                      log.setC_msg(json1.get("msg")!=null?json1.getString("msg"):"");
                      JSONObject  json2 = JSONObject.parseObject("{"+result[1]+"}");
                      log.setC_code(json2.get("code")!=null?json2.getString("code"):""); 
                      String a =    body1.toString().substring(body1.toString().indexOf(result[2]), body1.toString().length()) ;
                      String aplus = "{"+a;
                      log.setC_data(aplus);
                  }
                  
                  if(result.length==2) {
                	  JSONObject  json1 = JSONObject.parseObject(result[0]+"}");
                      log.setC_msg(json1.get("msg")!=null?json1.getString("msg"):"");
                      JSONObject  json2 = JSONObject.parseObject("{"+result[1]);
                      log.setC_code(json2.get("code")!=null?json2.getString("code"):""); 
                  }
			} catch (Exception e) {
				// TODO: handle exception
				log.setC_code("500");
				log.setC_msg("error");
			}
     
                log.setC_url(url);
                URI newurl =null ;
				try {
					newurl = new URI(url);
				} catch (URISyntaxException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
                log.setC_port(newurl.getPort()+"");
                log.setC_hostIp(newurl.getHost());
                log.setC_function(newurl.getPath());
                log.setC_user(usernum);
                if(!requestPath.contains("UrlList")) {
                	Integer i = qualityMapper.checkRepeatLog(log.getC_function());
                	if(i==0) {
                		 qualityMapper.insertOperateLog(log);
                	}
                	
                }
               
	            return body;
	        }
	        return body;
	    }

       //获取url中手机号(支持多个)
	   public String getTelnum(String sParam){

		   if(sParam.length()<=0)
		   return "";
		   Pattern pattern = Pattern.compile("(1|861)(3|5|8)\\d{9}$*");
		   Matcher matcher = pattern.matcher(sParam);
		   StringBuffer bf = new StringBuffer();
		   while (matcher.find()) {
		   bf.append(matcher.group()).append(",");
		   }
		   int len = bf.length();
		   if (len > 0) {
		   bf.deleteCharAt(len - 1);
		   }
		   return bf.toString();
		   }

	@Override
	public boolean supports(MethodParameter arg0, Class arg1) {
		// TODO Auto-generated method stub
		return true;
	}
	public static String getIP(String url) {
        //使用正则表达式过滤,
        String re = "((http|ftp|https)://)(([a-zA-Z0-9._-]+)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))(([a-zA-Z]{2,6})|(:[0-9]{1,4})?)";
        String str = "";
        // 编译正则表达式
        Pattern pattern = Pattern.compile(re);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(url);
        //若url==http://127.0.0.1:9040或www.baidu.com的,正则表达式表示匹配
        if (matcher.matches()) {
            str = url;
        } else {
            String[] split2 = url.split(re);
            if (split2.length > 1) {
                String substring = url.substring(0, url.length() - split2[1].length());
                str = substring;
            } else {
                str = split2[0];
            }
        }
        return str;
    }

    private static URI getIP1(URI uri) {
        URI effectiveURI = null;
        try {
            effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null);
        } catch (Throwable var4) {
            effectiveURI = null;
        }
        return effectiveURI;
    }

}

```java
在这里插入代码片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值