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