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日

相关文章

  • 超级全面的PHP面试题整理集合

    下面是详细的“超级全面的PHP面试题整理集合”的攻略: 了解题目类型 首先,我们需要了解常见的PHP面试题目类型,包括基础知识、算法题、框架相关、数据库相关等。通过了解这些题目类型,我们可以对备考做出有针对性的准备。 例如,对于基础知识题目,需要掌握变量、语法规则、函数等基本知识,同时还需要注意PHP的底层实现原理;对于算法题目,需要熟练掌握各类排序、查找、…

    Java 2023年6月15日
    00
  • 安装Java时怎么拦截推广软件?

    下面是“安装Java时怎么拦截推广软件”的完整攻略: 1. 下载Java安装程序 首先,我们需要从Oracle官网上下载Java的安装程序,选择适合自己系统的版本,然后双击运行安装程序。 2. 进入安装向导 在开始安装Java之前,系统会询问你是否同意Oracle的许可协议,同意后点击“下一步”按钮。接着你会看到“选择安装选项”界面,我们需要选择“自定义安装…

    Java 2023年5月26日
    00
  • 整理的比较全的一句话后门代码(方面大家查找后门)

    如何查找后门: 首先,要清楚什么是后门代码。后门代码是指程序员为了方便自己的管理而在程序中设置的留口,可以快速地绕过正常的登录验证方式,对系统的安全造成威胁。一些常见后门代码的特征包括容易被搜索的字符序列,包含明显的登录验证过程,并且能与一个远程服务器进行通信等。 在代码中搜索常用的后门代码字符串。一些常见的后门代码包括“eval”,“base64_deco…

    Java 2023年6月15日
    00
  • Spring Boot中lombok的安装与使用详解

    下面我来详细讲解“Spring Boot中lombok的安装与使用详解”的完整攻略。 什么是lombok? Lombok是一种Java库,它可以自动帮我们生成getter、setter、构造函数、日志记录等代码,让我们可以专注于业务代码的编写。 安装lombok Spring Boot默认并不包含lombok库,因此需要手动添加。 Maven中添加依赖 在m…

    Java 2023年5月19日
    00
  • 详解Spring框架入门

    下面我将为您详细讲解“详解Spring框架入门”的完整攻略。 1. 什么是Spring框架 Spring框架是一个用于Java应用程序开发的开源框架。它最初由Rod Johnson在2002年创建,旨在提供一种允许Java程序员开发企业级应用程序的框架。Spring框架基于Java语言,使用IoC(Inversion of Control)和AOP(Aspe…

    Java 2023年5月20日
    00
  • Java之IO流面试题案例讲解

    下面我将为你详细讲解Java之IO流面试题案例讲解的完整攻略。 一、概述 在讲解IO流面试题之前,我们先来了解一下IO流的概念。IO流是Java语言中用于处理输入输出的机制。在Java中,IO流分为两种:字节流和字符流。字节流主要用于二进制数据的输入输出,字符流主要用于文本数据的输入输出。在使用IO流时需要注意的一个常见问题是:IO流必须正确关闭,否则会导致…

    Java 2023年5月24日
    00
  • Docker运行Web服务实战之Tomcat的详细过程

    下面我将为你详细讲解“Docker运行Web服务实战之Tomcat的详细过程”的完整攻略。 1. Docker安装 首先,你需要安装 Docker。Docker有多种安装方式,例如在Ubuntu系统上可以按照以下步骤安装: sudo apt-get update sudo apt install docker.io 安装完成后,你可以使用以下命令检查 Doc…

    Java 2023年5月19日
    00
  • 微信小程序上传文件到阿里OSS教程

    下面是详细的“微信小程序上传文件到阿里OSS教程”,包含以下步骤: 1. 注册阿里云账号 如果还没有阿里云的账号,需要先注册一个账号,注册地址:https://account.aliyun.com/register/register.htm 2. 创建 OSS Bucket 登录阿里云控制台,进入对象存储 OSS 控制台,创建自己需要的 Bucket。具体操…

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