SpringBoot过滤器实现项目内接口过滤详解

 更新时间:2023年04月20日 15:45:46   作者:黑子桑  
这篇文章主要为大家详细介绍了SpringBoot如何利用过滤器实现项目内接口过滤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下

业务

由于业务需求,存在两套项目,一套是路由中心,一套是业务系统.

现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务.

现在需要通过调用路由中心将接口重新路由到指定的业务系统中

需要处理的问题

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

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

处理步骤

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

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

处理步骤

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("过滤器初始化");
    }

2.获取请求接口路径

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestName = request.getRequestURI();

3.判断是否是路由中心的接口

        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();
    }

代理转发实现

spring boot实现超轻量级网关的方法(反向代理、转发)

到此这篇关于SpringBoot过滤器实现项目内接口过滤详解的文章就介绍到这了,更多相关SpringBoot项目接口过滤内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决IDEA创建SpringBoot项目没有Java版本8问题

    解决IDEA创建SpringBoot项目没有Java版本8问题

    这篇文章主要介绍了解决IDEA创建SpringBoot项目没有Java版本8问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • java并发学习之BlockingQueue实现生产者消费者详解

    java并发学习之BlockingQueue实现生产者消费者详解

    这篇文章主要介绍了java并发学习之BlockingQueue实现生产者消费者详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Springboot集成mqtt客户端详解

    Springboot集成mqtt客户端详解

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。本文为大家分享了Springboot整合mqtt服务的示例代码,需要的可以参考一下
    2022-10-10
  • Java基于IDEA实现http编程的示例代码

    Java基于IDEA实现http编程的示例代码

    这篇文章主要介绍了Java基于IDEA实现http编程的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java后台接口开发初步实战教程

    Java后台接口开发初步实战教程

    下面小编就为大家分享一篇 Java后台接口开发初步实战教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • java实现中英文混合字符截取方法

    java实现中英文混合字符截取方法

    这篇文章主要为大家详细介绍了java实现中英文混合字符的截取方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • ElasticSearch查询文档基本操作实例

    ElasticSearch查询文档基本操作实例

    这篇文章主要为大家介绍了ElasticSearch查询文档基本操作实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 基于Java回顾之反射的使用分析

    基于Java回顾之反射的使用分析

    本篇文章是对Java反射的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 2020最新 idea下载、安装与创建项目测试的教程图解

    2020最新 idea下载、安装与创建项目测试的教程图解

    这篇文章主要介绍了2020最新 idea下载、安装与创建项目测试的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Intellij IDEA神器居然还有这些小技巧

    Intellij IDEA神器居然还有这些小技巧

    Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜,本文给大家主要介绍一些你可能不知道的但是又实用的小技巧,感兴趣的朋友跟随小编一起看看吧
    2021-01-01

最新评论