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

时间:2025-04-25 08:03:34
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 = () == null ? uri : (uri + "?" + ()); //("请求URl::: "+url); //("返回值JSON::: "+body); String usernum = getTelnum(url); //("使用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 = (regEx, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(url); //若url==http://127.0.0.1:9040或的,正则表达式表示匹配 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 在这里插入代码片