spring boot过滤器实现项目内接口过滤

spring boot过滤器实现项目内接口过滤

业务

由于业务需求,存在两套项目,一套是路由中心,一套是业务系统.
现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务.
现在需要通过调用路由中心将接口重新路由到指定的业务系统中

image

需要处理的问题

  1. 将小程序,公众号用户信息与业务系统做绑定
  2. 将路由中心的接口与业务系统的接口判断出来
  3. 通过用户信息找到的业务系统服务,分发到对应的业务系统中

公众号用户信息与业务系统做绑定

处理步骤

  1. 业务系统存在手机号,如果用户注册将手机号发送给路由中心记录

将路由中心的接口与业务系统的接口判断

处理步骤

  1. 获取路由中心系统中接口映射
    private static List<String> URLS = new ArrayList<>();
    @Resource
    private WebApplicationContext applicationContext;
	
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        applicationContext
		.getBean(RequestMappingHandlerMapping.class)
		.getHandlerMethods()
		.forEach((k, v) -> { k.getPatternsCondition().getPatterns().stream().forEach(s-> URLS.add(s)); });
        log.info("过滤器初始化");
    }
  1. 获取请求接口路径
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestName = request.getRequestURI();
  1. 判断是否是路由中心的接口
        if (URLS.contains(requestName)) {
		//系统接口
            chain.doFilter(servletRequest, servletResponse);
        } else {
		//业务系统接口 需要代理
//            代理请求
            ResponseEntity<String> redirect = routerService.redirect(request, response, "xxx", "xxx");
            //设置将字符以"UTF-8"编码输出到客户端浏览器
            response.setCharacterEncoding("UTF-8");
            //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
            response.setHeader("content-type", "application/json; charset=utf-8");
            response.getWriter().write(redirect.getBody());
        }

全部代码

import com.jyw.router.miniapp.service.IRouterService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.ResponseEntity;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 沈峻
 * @ClassName RouterFilter
 * @Description TODO
 * @Date 2023/4/20 12:23
 **/
@Configuration
@WebFilter(urlPatterns = "/*", filterName = "Router")
@Slf4j
public class RouterFilter implements Filter {

    private static List<String> URLS = new ArrayList<>();
    @Resource
    private WebApplicationContext applicationContext;

    @Resource
    private IRouterService routerService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        applicationContext.getBean(RequestMappingHandlerMapping.class).getHandlerMethods().forEach((k, v) -> { k.getPatternsCondition().getPatterns().stream().forEach(s-> URLS.add(s)); });
        log.info("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestName = request.getRequestURI();

        /*顺手解决跨域问题*/
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

        log.info(requestName);
        if (URLS.contains(requestName)) {
            chain.doFilter(servletRequest, servletResponse);
        } else {
//            代理请求
            ResponseEntity<String> redirect = routerService.redirect(request, response, "http://192.168.2.18/api", "/router");


            //设置将字符以"UTF-8"编码输出到客户端浏览器
            response.setCharacterEncoding("UTF-8");
            //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
            response.setHeader("content-type", "application/json; charset=utf-8");
            response.getWriter().write(redirect.getBody());
        }
        log.info("--------------------------------------------------------");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }

代理转发实现

https://www.cnblogs.com/shenjun980326/p/spring-boot-route.html

原文链接:https://www.cnblogs.com/shenjun980326/p/spring-boot-filter-interface.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot过滤器实现项目内接口过滤 - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • Java工具类BeanUtils库介绍及实例详解

    Java工具类BeanUtils库介绍及实例详解 什么是BeanUtils BeanUtils 是 Apache 组织下的一个开源 Java 工具类库,它提供了一个简单的 API,以便应用开发人员能够快速地使用反射方式实现 JavaBean 的属性拷贝、生成新对象等操作,尤其适用于对象之间属性值的复制,使得开发者无需编写繁琐的属性赋值代码。BeanUtils…

    Java 2023年5月26日
    00
  • Java JSON转成List结构数据

    下面我将详细讲解Java中如何将JSON转成List结构数据的完整攻略。 环境准备 首先需要引入相关依赖包,可以使用Maven管理依赖,将以下代码添加到项目根目录下的pom.xml文件中: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

    Java 2023年5月26日
    00
  • 使用idea开发javaWeb应用程序的思路(实现用户的增删改查)

    下面我从以下几个方面来详细讲解使用Idea开发JavaWeb应用程序的思路,实现用户的增删改查: 环境准备 首先我们需要准备好Java开发环境和Web容器,推荐使用JDK8和Tomcat8。然后我们需要安装Idea开发工具。 创建JavaWeb项目 在Idea中创建一个JavaWeb项目,选择Web Application模板,并勾选Web.xml文件。创建…

    Java 2023年6月15日
    00
  • Java实时获取基金收益项目源码分享

    Java实时获取基金收益项目源码分享 本文介绍使用Java编写程序实时获取基金收益的方法。用户可以输入基金代码,程序会自动访问天天基金网站获取最新的基金收益数据,并实时展示在命令行窗口中。如果用户需要保存数据,程序还提供了将数据保存为CSV文件的功能。 准备工作 在开始编写Java程序之前,需要安装Java开发环境(JDK)以及Maven构建工具。 下载依赖…

    Java 2023年6月1日
    00
  • JAVA API 实用类 String详解

    JAVA API 实用类 String详解 String类概述 在Java中,String类是一个非常重要的类,被广泛应用于很多领域。String类是Java API(应用程序接口)中提供的常用的实用类。String类没有公共构造方法,因此在创建String对象时,可以直接使用字面值创建对象。 String类的常用方法: length():获取字符串长度 c…

    Java 2023年5月26日
    00
  • 利用Dockerfile制作java运行环境的镜像的方法步骤

    准备Java应用程序 在制作Java运行环境的Docker镜像前,需要先准备好Java应用程序,比如一个Java Web应用程序,这里以名为“example”的Spring Boot应用程序为例。 编写Dockerfile Dockerfile是Docker镜像的构建脚本,需要在其中指定Docker镜像的环境以及各种组件。以下是一个基础的Dockerfile…

    Java 2023年5月19日
    00
  • Java 集合框架之List 的使用(附小游戏练习)

    Java 集合框架之 List 的使用 List的概念介绍 在Java的集合框架中,List是其中一个非常重要和常用的容器类。它可以存储有序、可重复的数据集合,并且允许对其中的元素进行增删改查等操作,非常方便。List可以通过下标/索引的方式访问其中的元素,也可以通过迭代器对其中的元素进行遍历。 常用的List实现类有:ArrayList、LinkedLis…

    Java 2023年5月26日
    00
  • Java实现PDF打印的解决方案

    Java实现PDF打印的解决方案 前言 PDF是一种非常流行的文件格式,同时,打印也是我们常用的功能之一。在Java开发中,有时候需要实现PDF打印功能,本文将详细讲解Java实现PDF打印的解决方案。 解决方案 Java提供了多种实现PDF打印功能的方案,下面我们将进行逐一讲解。 方案一:使用iText库 iText是一个非常流行的Java PDF库,它提…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部