>  기사  >  Java  >  SpringBoot 필터는 프로젝트 내에서 인터페이스 필터링을 어떻게 구현합니까?

SpringBoot 필터는 프로젝트 내에서 인터페이스 필터링을 어떻게 구현합니까?

WBOY
WBOY앞으로
2023-05-15 08:10:101303검색

비즈니스

비즈니스 요구로 인해 두 가지 프로젝트 세트가 있습니다. 하나는 라우팅 센터이고 다른 하나는 비즈니스 시스템입니다.

이제 문제는 라우팅 센터가 WeChat 공식 계정과 미니 프로그램 모듈 기능을 통합한다는 것입니다. 그리고 비즈니스 시스템은 많은 서비스 세트를 배포했습니다.

이제 라우팅 센터에 전화하여 지정된 비즈니스 시스템으로 인터페이스를 다시 라우팅해야 합니다

SpringBoot 필터는 프로젝트 내에서 인터페이스 필터링을 어떻게 구현합니까?

처리해야 할 문제

  • 미니 프로그램과 바인딩 공용 계정 사용자 정보를 비즈니스 시스템과

  • 라우팅 센터 인터페이스와 비즈니스 시스템 인터페이스를 판단

  • 사용자 정보를 통해 찾은 비즈니스 시스템 서비스를 해당 비즈니스 시스템에 배포

비즈니스 시스템에 공개 계정 사용자 정보

처리 단계

비즈니스 시스템에 휴대폰 번호가 있습니다. 사용자가 등록하면 휴대폰 번호가 기록을 위해 라우팅 센터로 전송됩니다

인터페이스를 판단하세요. 비즈니스 시스템의 인터페이스에서 라우팅 센터

처리 단계

1. 라우팅 센터 시스템 Mapping

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

위 내용은 SpringBoot 필터는 프로젝트 내에서 인터페이스 필터링을 어떻게 구현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제