当前位置: 首页 > news >正文

郑州网站推广公司排名加强网站信息内容建设管理

郑州网站推广公司排名,加强网站信息内容建设管理,公司的网站建设规划书,导航类网站怎么做排名文章目录 一、最终使用效果(ClientIp 注解获取)二、实现代码1.注解2.方法参数解析器(Resolver)3.全局增加Resolver配置 Spring 框架没有现成工具可以方便提取客户端的IP地址,普遍做法就是通过 HttpServletRequest 的 g…

文章目录

  • 一、最终使用效果(@ClientIp 注解获取)
  • 二、实现代码
    • 1.注解
    • 2.方法参数解析器(Resolver)
    • 3.全局增加Resolver配置

Spring 框架没有现成工具可以方便提取客户端的IP地址,普遍做法就是通过 HttpServletRequest 的 getRemoteAddr 方法获取IP地址。

存在以下问题:
1.proxy:部分客户端使用代理后此方法返回的是代理网络的IP地址,非用户真实 IP
2.SLB:后台经过负载均衡,如阿里云的SLB实例 3,方法返回地址是SLB实例 IP,并非用户真实 IP
3.环回地址:在本地测试时获取到的是ipv4:127.0.0.1 或者 ipv6:0:0:0:0:0:0:0:1,并非本机分配地址
4.代码简洁与耦合:每次获取地址都需要注入 HttpServletRequest 再提取,使用 Spring WebFlux 1 而不是Spring MVC,没有此对象可用
5.获取地址可能是IPv6 地址,长度不同,数据库需要兼容处理,适配以后 IPv6需求

问题解决:
1.proxy :经过代理后通常可用通过 http header 的 Proxy-Client-IP 获取用户真实 IP地址
2.SLB:经过SLB实例后可通过 http header 的 X-Forwarded-For 获取用户真实IP
3.环回地址:如果是环回地址,则根据网卡取本机配置的IP,如192.168.199.123 等
4.代码简洁与耦合:实现参数解析器,使用注解方式获取IP,如 @ClientIp
5.不同版本 IP 长度不同,取最长作为数据库存储长度(47最长)

一、最终使用效果(@ClientIp 注解获取)

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;@Slf4j
@RestController
@RequestMapping("/test")
@EnableAutoConfiguration
public class OrderController {@GetMapping("/hello")@ResponseBody@ResponseStatus(HttpStatus.OK)public String hello(@ClientIp String ip) {return "hello, ip = " + ip;}
}

二、实现代码

注:下面为 Spring MVC 下的实现代码,如需在Spring webFlux 下使用,同理实现下面方法、配置即可
org.springframework.web.reactive.result.method.HandlerMethodArgumentResolver
org.springframework.web.reactive.config.WebFluxConfigurer

1.注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClientIp {}

2.方法参数解析器(Resolver)

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;import javax.servlet.ServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;public class ClientIpResolver implements HandlerMethodArgumentResolver {private static final String[] IP_HEADER_CANDIDATES = {"X-Forwarded-For","Proxy-Client-IP","WL-Proxy-Client-IP","HTTP_X_FORWARDED_FOR","HTTP_X_FORWARDED","HTTP_X_CLUSTER_CLIENT_IP","HTTP_CLIENT_IP","HTTP_FORWARDED_FOR","HTTP_FORWARDED","HTTP_VIA","REMOTE_ADDR"};@Overridepublic boolean supportsParameter(MethodParameter param) {return param.getParameterType().equals(String.class) &&param.hasParameterAnnotation(ClientIp.class);}@Overridepublic Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest,WebDataBinderFactory binderFactory) {// 提取header得到IP地址列表(多重代理场景),取第一个IPfor (String header : IP_HEADER_CANDIDATES) {String ipList = webRequest.getHeader(header);if (ipList != null && ipList.length() != 0 &&!"unknown".equalsIgnoreCase(ipList)) {return ipList.split(",")[0];}}// 没有经过代理或者SLB,直接 getRemoteAddr 方法获取IPString ip = ((ServletRequest) webRequest.getNativeRequest()).getRemoteAddr();// 如果是本地环回IP,则根据网卡取本机配置的IPif ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {try {InetAddress inetAddress = InetAddress.getLocalHost();return inetAddress.getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();return ip;}}return ip;}
}

3.全局增加Resolver配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class NetWebMvcConfigurer implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(clientIpResolver());}@Beanpublic ClientIpResolver clientIpResolver() {return new ClientIpResolver();}
}
http://www.sczhlp.com/news/55446/

相关文章:

  • 高新技术企业申报网站网络公司运营模式
  • Kubernetes核心-Ingress-metallb
  • 无锡网站制作价格网站 开发 文档
  • 行业门户网站运营优秀设计作品赏析
  • 校园资源共享网站建设英国做暧小视频网站
  • 我是做废品回收,最近有个变宝网主动联系我说是再生资源网站的,可信吗?网页架构
  • 获胜者网站建设软件项目外包网站
  • 企业网站seo优化怎么做织梦如何将wordpress
  • 网站设计中的技术分析网站建设需要的功能
  • 焦作网站建设哪家专业一个网站的建设步骤
  • 回溯专题其二(分割篇)
  • 第2章:关系数据库
  • 怎么把网站黑了官方网站建设 在线磐石网络
  • 苏州网站建设自助建站模板大上海小程序开发
  • 商城网站备案需要什么企业内部网站建设
  • 平度做网站公司no7wordpress
  • 做网站需要技术如何免费制作微信小程序
  • 正规接单网站郑州营销型网站建设哪家好
  • 照明网站建设东莞找工作最新招聘信息
  • 网站制作交易流程设计公司装修图
  • 灯饰模板网站企业电子商务网站建设规划
  • 做淘宝店铺装修的公司网站做物流网站的公司
  • 布吉做棋牌网站建设网站的v2信誉认证怎么做
  • 用手机搭建自己的网站如何提升网站的转化率
  • 做菠菜网站好赚吗优质的南昌网站建设
  • 电子商务系统网站设计建站快车打电话
  • 网站需求分析是在建站的什么阶段做的_为什么要做?scala做网站
  • 网站建设及售后服务的说明书网站策划常用软件
  • 快速搭建网站推荐彩票网站怎么做系统
  • 网上做兼职网站正规北京朝林建设集团网站