Springboot 获取响应信息,修改响应信息

通过拦截器只能获取到controller下的
restcontroller不能通过拦截器实现


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @program: 获取响应信息  更改响应信息
 * @description:
 * @author: chen
 * @create:
 **/

@ControllerAdvice
public class ResponseBodyTest implements ResponseBodyAdvice<R> {

    private static final Logger logger = LoggerFactory.getLogger(ResponseBodyTest.class);


    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {

        return true;

    }


    //获取响应信息 修改响应  restResult.put覆盖响应消息
    @Override
    public R beforeBodyWrite(R restResult, MethodParameter methodParameter,
                             MediaType mediaType,
                             Class<? extends HttpMessageConverter<?>> aClass,
                             ServerHttpRequest serverHttpRequest,
                             ServerHttpResponse serverHttpResponse) {
        //System.out.println("测试返回");
        // 转换对象
        HttpServletRequest request = ((ServletServerHttpRequest) serverHttpRequest).getServletRequest();
        HttpServletResponse response = ((ServletServerHttpResponse) serverHttpResponse).getServletResponse();

        logger.info("____________________________________________________________");
        logger.info(methodParameter.getDeclaringClass().getName());
        if ((Boolean) restResult.get("success")){
            logger.info(methodParameter.getMethod().getName()+"方法返回值:"+restResult.get("msg"));
        }else {
            logger.error(methodParameter.getMethod().getName()+"方法返回值:"+restResult.get("msg"));
        }
        logger.info("------------------------------------------------------------");
        //修改响应信息  直接覆盖掉就可以了 响应类是map
        restResult.put("msg","返回信息")
        return restResult;
    }
}


响应类

package com.molomessage.message.sys.utils;
import java.util.HashMap;
import java.util.Map;

/**
 * 返回数据
 * 
 * @author chen
 * @date
 */
public class R extends HashMap<String, Object> {
	private static final long serialVersionUID = 1L;
	public R() {
		put("success",true);
		put("code", 0);
		put("msg","操作成功");
	}
	
	public static R error() {
		return error(500, "未知异常,请联系管理员");
	}
	public static R error(String msg) {
	    return error(500, msg);
	}
	
	public static R error(int code, String msg) {
		R r = new R();
		r.put("code", code);
		r.put("msg", msg);
		r.put("success",false);

		return r;
	}

	public static R ok(String msg, Object obj) {
		R r = new R();
		r.put("success",true);
		r.put("msg", msg);
		r.put("data", obj);
		return r;
	}
	public static R ok(String msg) {
		R r = new R();
		r.put("success",true);
		r.put("msg", msg);
		return r;
	}
	
	public static R ok(Map<String, Object> map) {
		R r = new R();
		r.putAll(map);
		return r;
	}
	
	public static R ok() {
		return new R();
	}

	public R put(String key, Object value) {
		super.put(key, value);
		return this;
	}
}

Spring Boot获取响应头中的IP地址可以通过以下方式实现。首先,您可以使用`HttpServletRequest`对象来获取请求的IP地址。在Spring Boot中,可以通过注入`HttpServletRequest`对象来获取它。然后,您可以使用`getHeader`方法来获取请求头中的IP地址。例如,以下代码片段展示了如何获取响应头中的IP地址: ```java @Autowired private HttpServletRequest request; public String getIpAddress() { String ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("WL-Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("HTTP_CLIENT_IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); } return ipAddress; } ``` 请注意,由于代理服务器的存在,请求头中的IP地址可能会被修改或隐藏。因此,上述代码中的`getIpAddress`方法尝试从多个请求头中获取IP地址,以确保获取到正确的IP地址。 引用\[1\]中的代码片段展示了如何使用`IpUtil`和`Ip2Region`来获取IP地址对应的省份信息。您可以根据实际情况进行调整和使用。 引用\[2\]中提到了一种使用网络API来查询IP地址归属地的方法。您可以使用淘宝的IP地址库API或纯真IP地址库API来查询IP地址的归属地。这些API提供了查询IP地址归属地的接口,您可以使用HTTP协议来调用这些接口,并从响应中解析出IP地址的归属地。 引用\[3\]中提到了对比IP所在城市信息的步骤。通过获取发起支付时的IP和扫码时的IP,您可以使用IP对应的城市进行对比。目前市面上有很多通过IP获取城市的开放接口,您可以选择使用收费的接口,如百度地图、高德地图,或者购买阿里云市场上的IP库来获取IP地址对应的城市信息。 综上所述,您可以使用上述方法来在Spring Boot获取响应头中的IP地址,并根据需要进行IP地址归属地的查询和对比。 #### 引用[.reference_title] - *1* *3* [【支付系统】java springboot 通过ip获取所在地城市信息](https://blog.csdn.net/qq_39078783/article/details/131123898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [springboot获取IP归属地](https://blog.csdn.net/weixin_35756690/article/details/129453664)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值