一、解决URL存在特殊符号|{}?&、URL中包含%2F、URL中包含%5C

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class RfcConfig {

    @Bean
    public void setRfc(){
        // 指定jre系统属性,允许特殊符号, 如{} 做入参,其他符号按需添加。见 tomcat的HttpParser源码 |{}?&。
        System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "|{}");
        // 这个是解决URL中包含%2F的问题
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
        // 这个是解决URL中包含%5C的问题
        System.setProperty("org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH", "true");
    }
}
@Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        //升级tomcat8.5.5或者更高版本get请求的特殊字符如{}[]|等就会被拦截导致前端参数无法传入到后台,提示400参数错误
        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]"));
        return tomcat;
    }

二、异步线程池配置

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;


/**
 * 异步线程池配置
 */
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer{

    @Override
    public Executor getAsyncExecutor() {
        // 线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        //线程池核心线程数,控制每次开启子线程数量
        taskExecutor.setCorePoolSize(5);
        //线程池维护线程的最大数量
        taskExecutor.setMaxPoolSize(10);
        //线程池所使用的缓冲队列
        taskExecutor.setQueueCapacity(25);
        //线程池维护线程所允许的空闲时间
        taskExecutor.setKeepAliveSeconds(30000);
        // 配置线程池中的线程的名称前缀 方便排查
        taskExecutor.setThreadNamePrefix("Async-Thread-");
        //CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        //设置拒绝策略:当pool已经达到max size的时候,使用预定义的异常处理类
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }

}

三、动态加载lib下所有jar包的方法

import org.springframework.util.ResourceUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * 动态加载lib下所有jar包的方法
 */
public class JarUtils {

    public static String getApplicationFolder() {
        String path = JarUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        return new File(path).getParent();
    }

    public static InputStream getInputStream() throws FileNotFoundException {
        //读取resources下面的lib文件夹的文件
        File file = ResourceUtils.getFile("classpath:lib/");
        return new FileInputStream(file);
    }


    public static void loadJarsFromAppFolder() throws Exception {
        String path = "./lib";
        File file = new File(path);
        if (file.isDirectory()) {
            for (File subj : file.listFiles()) {
                if (subj.isFile()) {
                    loadJarFile(subj);
                }
            }
        } else {
            loadJarFile(file);
        }
    }

    public static void loadJarFile(File path) throws Exception {
        URL url = path.toURI().toURL();
        // 可以获取到AppClassLoader,可以提到前面,不用每次都获取一次
        URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        // 加载
        Method method = URLClassLoader.class.getDeclaredMethod("URL", URL.class);
        method.setAccessible(true);
        method.invoke(classLoader, url);
    }
}

四、Spring Cloud、Dubbo、HSF

Spring Cloud

java 去掉url参数 java处理url特殊字符_java 去掉url参数

Spring Cloud 提供了简化应用开发的一系列标准和规范。这些标准和规范包含了服务发现、负载均衡、熔断、配置管理、消息事件驱动、消息总线等,同时 Spring Cloud 还在这些规范的基础上,提供了服务网关、全链路跟踪、安全、分布式任务调度和分布式任务协调的实现。

目前业界比较流行的 Spring Cloud 具体实现有 Spring Cloud Netflix、Spring Cloud Consul、Spring Cloud Gateway、Spring Cloud Sleuth 等,最近由阿里巴巴中间件开源的 Spring Cloud Alibaba 也是业界中受关注度很高的另一种实现。

Dubbo

java 去掉url参数 java处理url特殊字符_动态加载lib下所有jar包_02


提供者在启动时,在注册中心注册服务。

消费者在启动时,在注册中心订阅所需的服务。

注册中心返回提供者地址列表给消费者。如果提供者发生变更,注册中心将推送变更数据给消费者。

消费者基于软负载均衡算法,从提供者地址列表中选一个提供者进行调用。

HSF

java 去掉url参数 java处理url特殊字符_解决URL存在特殊符号_03


高速服务框架HSF (High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框架。

HSF作为一个纯客户端架构的RPC框架,HSF没有服务端集群,所有HSF服务调用均是通过服务消费方(Consumer)与服务提供方(Provider)点对点进行。为了实现整套分布式服务体系,HSF还需要依赖以下外部系统。

应用开发方式:

Ali-Tomcat: 依赖Ali-Tomcat和Pandora,提供了完整的HSF功能,包括服务注册与发现、隐式传参、异步调用、泛化调用和调用链路Filter扩展。应用程序须以WAR包方式部署。

Pandora Boot:依赖Pandora,提供了比较完整的HSF功能,包括服务注册与发现、异步调用。应用程序编译为可运行的JAR包并部署即可。

参考:https://www.alibabacloud.com/help/zh/doc-detail/100087.htm