您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页SpringBoot中Filter的使用之跨系统调用

SpringBoot中Filter的使用之跨系统调用

来源:意榕旅游网

SpringBoot中Filter的使用之跨系统调用

目的

  • 有两个系统,分别是系统A和系统B;现在有这么个需求,就是在A系统中用到B系统的数据。

解决方案

  • 这时候你可能想到直接调用B系统的接口来获取数据
    • 但是你想过没有,如果在A系统中调用B系统的东西,将会发生跨域问题
  • 明确跨域问题是发生在浏览器中的,解决方案可以在A系统中加入对B系统的URL的过滤,具体设计如下图

具体的代码中实现

  • 过滤器代码

 

@Component
@WebFilter(filterName = "TransFilter", urlPatterns = {"/kungfupeng/sysA/transToB/*"})
public class TransFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponseWrapper httpResponse = new HttpServletResponseWrapper((HttpServletResponse) response);

        //获取参数映射键值对
        Map<String, String[]> parameterMap = httpRequest.getParameterMap();

        //组装新的参数键值映射对-----start-----
        Map<String, String> newParams = new HashMap<String, String>();

        if (parameterMap != null && parameterMap.size() != 0) {
            for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
                //这里的参数可以根据需求来定【这里默认为一key一value】
                newParams.put(entry.getKey(), entry.getValue()[0]);
            }
        }
        //组装新的参数键值映射对------end------

        //获取需要地址转换的路径
        String path = httpRequest.getRequestURI();

        //做校验,是否是满足地址转换的条件
        if (path != null && path.contains("/sysA/transToB/")) {
            path = path.replace("/sysA/transToB/", "/sysB/");

            //拼接访问B系统的地址
            path = "http://kungfupeng" + path;

            //利用OkHttp工具类来进行对B系统的访问【这里的参数一定记得传递过去】
            String s = OkHttpUtils.get(path, newParams);

            //返回的结果
            System.out.println("返回字符串【" + s + "】");

            //设置返回内容编码格式
            httpResponse.setHeader("Content-type", "text/html; charset=utf-8");

            //从系统A进行返回
            httpResponse.getWriter().write(s);
        } else {
            chain.doFilter(request, response);
        }

        return;
    }

    @Override
    public void destroy() {

    }
}

补充【OkHttp的工具类】

  • pom文件的依赖配置

     

    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>3.9.1</version>
    </dependency>
    <dependency>
        <groupId>com.squareup.okio</groupId>
        <artifactId>okio</artifactId>
        <version>1.14.0</version>
    </dependency>
    
  • Okhttp工具类

     

    public class OkHttpUtils {
        public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    
        public OkHttpUtils() {
        }
    
        public static String postJson(String url, String json) {
            Response response = null;
            OkHttpClient okHttpClient = new OkHttpClient();
            RequestBody body = RequestBody.create(JSON, json);
            Request request = (new Builder()).post(body).url(url).build();
            Call call = okHttpClient.newCall(request);
    
            try {
                System.err.println("Send!!!!");
                response = call.execute();
                System.err.println("code = " + response.code());
                System.err.println("all = " + response.toString());
                return response.body().string();
            } catch (Exception var8) {
                System.err.println("Error!!!!");
                var8.printStackTrace();
                return null;
            }
        }
    
        public static String post(String url, Map<String, String> params) {
            Response response = null;
            OkHttpClient okHttpClient = new OkHttpClient();
            if (params == null) {
                params = new HashMap();
            }
    
            okhttp3.FormBody.Builder builder = new okhttp3.FormBody.Builder();
            Set<Entry<String, String>> entrySet = ((Map)params).entrySet();
            Iterator var6 = entrySet.iterator();
    
            while(var6.hasNext()) {
                Entry<String, String> entry = (Entry)var6.next();
                builder.add((String)entry.getKey(), (String)entry.getValue());
            }
    
            RequestBody requestBodyPost = builder.build();
            Request request = (new Builder()).post(requestBodyPost).url(url).build();
            Call call = okHttpClient.newCall(request);
    
            try {
                System.err.println("Send!!!!");
                response = call.execute();
                System.err.println("code = " + response.code());
                System.err.println("all = " + response.toString());
                return response.body().string();
            } catch (Exception var10) {
                System.err.println("Error!!!!");
                var10.printStackTrace();
                return null;
            }
        }
    
        public static String get(String url, Map<String, String> params) {
            return post(url, params);
        }
    }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务