Swagge文档根据IP进行授权拦截

news/2024/11/16 18:03:43/

我们在上一篇文章中介绍了swagger加密码的方式和代码。

swagger添加访问密码_zlfjavahome的博客-CSDN博客

但是有的公司有更严格的要求,比如限制IP访问,这篇文章就讲一下如何通过IP进行访问控制,只允许特定的IP地址访问Swagger接口。

第一步,写一个工具类,用来组装返回的json数据

public class CommonTokenHandler {/*** 返回错误信息* @param httpResponse* @param status* @param msg* @param request* @throws Exception*/public void setReturn(HttpServletResponse httpResponse, int status, String msg, HttpServletRequest request) throws Exception {PrintWriter writer = null;httpResponse.setHeader("Access-Control-Allow-Credentials", "true");httpResponse.setHeader("Access-Control-Allow-Origin", request.getAttribute("Access-Control-Allow-Origin") == null?null:request.getAttribute("Access-Control-Allow-Origin").toString());//UTF-8编码httpResponse.setCharacterEncoding("UTF-8");httpResponse.setContentType("application/json;charset=utf-8");Map<String, Object> result = new HashMap<>();result.put("code", status);result.put("msg", msg);JSONObject jsonObject = new JSONObject(result);String json = jsonObject.toString();try {writer = httpResponse.getWriter();writer.print(json);} catch (Exception ex) {ex.printStackTrace();} finally {if (writer != null){writer.close();}}}}

第二步:写一个拦截器,拦截器继承CommonTokenHandler

@Component
@Slf4j
public class SwaggerHandler extends CommonTokenHandler implements HandlerInterceptor {@Autowiredprivate RedisUtil redisUtil;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String requestURI = request.getRequestURI();log.info("requestURI = {}", requestURI);String ipAddr = IpUtils.getIpAddr(request);log.info("请求IP....{}", ipAddr);if (Objects.toString(ipAddr).equals("127.0.0.1")) {return true;}// 这里是自定义redis的keyObject key = redisUtil.get(RedisKeyUtil.swaggerIP());if (key == null || !key.toString().contains(ipAddr)) {String msg = "您的IP" + ipAddr + "没有访问swagger的权限,请先配置!";log.info(msg);setReturn( response, 7002, msg, request);return false;}return true;}
}

IP工具类:

public class IpUtils {public static String getIpAddr(HttpServletRequest request) {String ip = null;if (request != null) {// X-Forwarded-For:Squid 服务代理String ipAddresses = request.getHeader("X-Forwarded-For");if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {// Proxy-Client-IP:apache 服务代理ipAddresses = request.getHeader("Proxy-Client-IP");}if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {// WL-Proxy-Client-IP:weblogic 服务代理ipAddresses = request.getHeader("WL-Proxy-Client-IP");}if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {// HTTP_CLIENT_IP:有些代理服务器ipAddresses = request.getHeader("HTTP_CLIENT_IP");}if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {// X-Real-IP:nginx服务代理ipAddresses = request.getHeader("X-Real-IP");}// 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IPif (ipAddresses != null && ipAddresses.length() != 0) {ip = ipAddresses.split(",")[0];}// 还是不能获取到,最后再通过request.getRemoteAddr();获取if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {ip = request.getRemoteAddr();}return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;}return null;}
}

 第三步,使用拦截器,新增拦截器配置类MyWebAppConfigurer,将swaggerHandler添加到拦截器链,对doc.html、swagger-ui.html同时拦截

@Configuration
@AutoConfigureOrder(-1)
public class MyWebAppConfigurer implements WebMvcConfigurer {@Autowiredprivate SwaggerHandler swaggerHandler;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则// excludePathPatterns 用户排除拦截registry.addInterceptor(swaggerHandler).addPathPatterns("/**/doc.html/**", "/**/swagger-ui.html/**","/swagger-resources/**","/swagger-ui/**");}/*** 修改StringHttpMessageConverter默认配置** @param converters*/@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}}

通过以上配置,就可以实现IP限制访问了,亲测可用!


http://www.ppmy.cn/news/675375.html

相关文章

Python实现发送电子邮件功能

大家好&#xff0c;以编程方式发送电子邮件可以成为自动化通信过程的一种强大方式&#xff0c;本文将探讨如何使用Python发送电子邮件&#xff0c;介绍如何设置SMTP服务器、为Gmail生成应用程序密码&#xff0c;并提供使用smtplib库发送电子邮件的逐步指南。 在深入研究编码之…

maven-plugin的理解与定义

文章目录 一、plugin的定义与配置1. 自定义plugin2. 绑定goal到maven执行周期3. 定义goal默认的maven周期4. 命令执行当前pom定义的execution5. plugin运行时采用最新dependencies6. 插件配置不在子pom生效 二、扩展 一、plugin的定义与配置 1. 自定义plugin 参考: 官网 基本…

【Docker私有仓库】创建与配置

Docker私有仓库 一、 私有仓库搭建与配置 &#xff08;1&#xff09;拉取私有仓库镜像&#xff08;此步省略&#xff09; docker pull registry&#xff08;2&#xff09;启动私有仓库容器 docker run -di --nameregistry -p 5000:5000 registry&#xff08;3&#xff09;打…

【python】解决TypeError: ‘str‘ object cannot be interpreted as an integer

当用python的input输入一个数字时 其格式默认为string格式 所以要用int()转换为int格式 比如 import math def opgg(): # x input("请输入第一个数字") # y input("请输入第二个数字") x int(input("请输入第一个数字")) …

lol最克制诺手的英雄_LOL:62个上单英雄,竟只有3个能克制诺手?第1名很多人想不到!...

在英雄联盟中&#xff0c;诺克萨斯之手一直是个非常热门的英雄&#xff0c;以暴力的伤害能力&#xff0c;极强的对面能力和大招斩杀技能的快感&#xff0c;深受很多玩家的喜欢&#xff0c;无论是低分段还是高分段&#xff0c;使用诺手上单的玩家都很多。诺手在上路可以算是食物…

wegame饥荒一直登录中_WeGame到底有多难用?“LOL大神自己编写一个插件,完美代替WG”...

前言&#xff1a;英雄联盟作为一款已经运营了十年之久的游戏&#xff0c;已经有了非常多的玩家和粉丝&#xff0c;随时游戏的不断发展&#xff0c;比赛机制的不断完善&#xff0c;这款游戏正在逐渐的走向世界。电竞行业的越来越热门&#xff0c;导致腾讯官方加大了对游戏的监管…

SAP PP T-Code

事务码 描述(中英文) CNR1 Create Work Center 生成工作中心 CNR2 Change Work Center 更改工作中心 CNR3 Display Work Center 显示工作中心 CR00 Resource Planning Menu 资源计划菜单 CR01 Create Work Center 生成工作中心 CR02 Change Work Center 更改工作中心 CR03 Disp…

利用matlab爬虫整理云顶之弈英雄信息

问题描述 https://lolchess.gg是一个很权威的云顶之弈资料站。从这个网站上可以整理出云顶之弈所有英雄的详细资料。可惜是英文网站&#xff0c;且不像OPGG一样有中文版&#xff0c;所以我们爬取的数据只能是英文版的。真是感叹国内居然没有一家网站去认真地去做云顶之弈的资料…