目的:

iServer发布的arcgis地图服务中,由于tileinfo参数为null,导致用arcgis-ios客户端开发的APP闪退。通过过滤器将get请求的返回值修改

代码:

 package com.channel.filter;

 import java.io.ByteArrayOutputStream;
import java.io.IOException; import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; /**
* 返回值输出代理类
*
* @Title: ResponseWrapper
* @Description:
* @author kokJuis
* @date 上午9:52:11
*/
public class ResponseWrapper extends HttpServletResponseWrapper { private ByteArrayOutputStream buffer; private ServletOutputStream out; public ResponseWrapper(HttpServletResponse httpServletResponse) {
super(httpServletResponse);
buffer = new ByteArrayOutputStream();
out = new WrapperOutputStream(buffer);
} @Override
public ServletOutputStream getOutputStream() throws IOException {
return out;
} @Override
public void flushBuffer() throws IOException {
if (out != null) {
out.flush();
}
} public byte[] getContent() throws IOException {
flushBuffer();
return buffer.toByteArray();
} class WrapperOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos; public WrapperOutputStream(ByteArrayOutputStream bos) {
this.bos = bos;
} @Override
public void write(int b) throws IOException {
bos.write(b);
} @Override
public boolean isReady() { // TODO Auto-generated method stub
return false; } @Override
public void setWriteListener(WriteListener arg0) { // TODO Auto-generated method stub }
} }

在dofilter中实现返回值的替换

 package com.channel.filter;

 import java.io.IOException;
import java.io.StringReader; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; /**
* 返回值输出过滤器,这里用来加密返回值
*
* @Title: ResponseFilter
* @Description:
* @author kokJuis
* @date 上午9:52:42
*/
public class ResponseFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
ResponseWrapper wrapperResponse = new ResponseWrapper(
(HttpServletResponse) response);// 转换成代理类
// 这里只拦截返回,直接让请求过去,如果在请求前有处理,可以在这里处理
filterChain.doFilter(request, wrapperResponse);
byte[] content = wrapperResponse.getContent();// 获取返回值
// 判断是否有值
if (content.length > 0) { String str = new String(content, "UTF-8");
System.out.println(str);
String ciphertext = null; // 判断下代码中是否包含tileinfo,包含则进行过滤,否则直接跳过响应体
if (str.contains("tileInfo")) {
try {
// 获取返回值中tileinfo值,将null替换成{}测试
ciphertext = str.replaceFirst("null", "{}");
System.out.println("修改对应的参数!");
} catch (Exception e) {
e.printStackTrace();
}
} // 把返回值输出到客户端
ServletOutputStream out = response.getOutputStream();
out.write(ciphertext.getBytes());
out.flush();
}
} public void init(FilterConfig arg0) throws ServletException { } public void destroy() { }
}

配置说明:
1、jar包复制到iserver安装目录\webapps\iserver\WEB-INF\lib下
2、修改iserver安装目录\webapps\iserver\WEB-INF的web.xml
3、在web.xml中新增如下配置:

<!-- 过滤请求 -->
<filter>
<filter-name>ResponseFilter</filter-name>
<filter-class>com.channel.filter.ResponseFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ResponseFilter</filter-name>
<url-pattern>/services/map-test2/arcgisrest/test/MapServer</url-pattern>
注:换成对应的的服务地址,只过滤指定的服务
</filter-mapping>

4、使用客户端动态出图,得到的返回值中tileinfo有null变为{}

SuperMap-iServer过滤请求返回值的更多相关文章

  1. 微信浏览器Ajax请求返回值走error

    微信浏览器Ajax post请求是返回值走的error $.ajax({ type: "POST", url: "https://XXXX", cache: f ...

  2. nodejs中使用http请求返回值为html时乱码问题

    今天用nodejs进行http请求时返回的数据是一个html文件,然后我还是按照以前解析json数据的方法.果不其然报错了:SyntaxError: Unexpected token  in JSON ...

  3. HTTP请求返回值所代表的含义

    一些常见的状态码为: 200 - 服务器成功返回网页(表示请求成功) 404 - 请求的网页不存在(可能是网络的问题,也可能是网页没办法访问不代表网页不存在) 503 - 服务器超时(服务器故障) 下 ...

  4. Jmeter 提取http请求返回值里json数据参数化方法

    第三方插件下载地址:http://jmeter-plugins.org/downloads/all/ 插件下载后解压:找到JMeterPlugins-Extras.jar,把JMeterPlugins ...

  5. 关于spring中请求返回值的json序列化/反序列化问题

    https://cloud.tencent.com/developer/article/1381083 https://www.jianshu.com/p/db07543ffe0a 先留个坑

  6. 学习笔记_springmvc返回值、数据写到页面、表单提交、ajax、重定向

    数据写到页面 后台往前台传数据 TestController添加 /** * 方法的返回值采用ModelAndView, new ModelAndView("index", map ...

  7. springmvc返回值、数据写到页面、表单提交、ajax、重定向

    实验是在前一篇文章的项目上做的: 数据写到页面 后台往前台传数据 TestController添加 /** * 方法的返回值采用ModelAndView, new ModelAndView(" ...

  8. Ext_两种处理服务器端返回值的方式

    1.Form表单提交返回值处理 //提交基本信息表单  f.form.submit({      clientValidation:true,      //表单提交后台处理地址      url:' ...

  9. dubbo rest返回值异常Incompatible types: declared root type

    2018-08-28 17:26:02,208 [http-bio-9090-exec-1][][][][][] ERROR com.wjs.member.plugin.intercepter.Ser ...

随机推荐

  1. Robot Framework - 建立本地测试环境

    注意:本文内容是以“在Window7系统中安装本地RobotFrmamework自动化测试环境”为例. Robot Framework简介 HomePage:http://robotframework ...

  2. Python档案袋( 命令行操作 及 Os与Shutil文件操作补充 )

    调用系统命令 import os #调用系统命令,输出只能输出到屏幕上,不能用变量接收 os.system("ipconfig") #调用系统命令,并把执行结果存到变量中 res= ...

  3. python学习笔记01-变量

    变量的作用: 1.保存信息  方便日后被调用 操作 2. 更改 代表描述性的意思 让人明白是什么意思 行业命名规则: 1.student_number 2.studentNumber 驼峰体 不要以大 ...

  4. 剑指offer【05】- 用两个栈实现队列(java)

    题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保 ...

  5. ES6之Promise的基本用法

    之前多次看过阮一峰的ES6教程,对Promise也简单的理解过,但是,由于没在项目中运用过,所以记忆的并不深刻,昨天在进行项目的改良,有一个地方需要用到Promise 所以就这样写了: onload函 ...

  6. Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

    本来这篇文章在昨天晚上就能发布的,悲剧的是写了两三千字的文章居然没保存,结果我懵逼了.今天重新来写这篇文章.今天我们就一起来探讨下如何重写Ocelot配置文件的存储方式以及获取方式. 作者:依乐祝 原 ...

  7. 解决关于 ionic3 启动白屏 控制台错误提示:Uncaught SyntaxError Use of const in strict mode.

    今天将项目从ionic2 升级为ionic3 ,ionic serve 运行在网页上无任何错误. 但是将项目打包成为android apk 却一直卡在启动页面 白屏,进不去的情况.后来在android ...

  8. 部署 YApi 接口管理服务

    安装 Node curl -sL https://rpm.nodesource.com/setup_8.x | bash - yum install -y nodejs 安装 MongoDB vi / ...

  9. [android]__如何在studio中导入,使用开源的UI组件

    前言 在编程开发中,我们对第三方的优质开源组件是十分依赖的,在很多时候,我们都会使用到他们.使用第三方开源组件能够给我们的编程开发带来很大的便利.今天以这篇文章记录关于在android项目中引用第三方 ...

  10. 自动化测试 | UI Automator 进阶指南

    UI Automator 相关介绍: 跨应用的用户界面自动化测试 包含在 AndroidX Test(https://developer.android.com/training/testing) 中 ...