springboot整合arcgis代理resource-proxy
1. 没有必要改造为servlet或者controller
之前写了文章,为了让代理能被系统登录验证拦截,所以想办法改为可控制的版本,servlet或者controller,现在发现并不用改造,修改项目配置支持jsp就行了,也能支持前后端分离项目。
2.配置springboot的支持jsp
- 依赖中添加tomcat的jsp包
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
- build中添加资源文件内容
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
3. 放入代理配置文件
- proxy.config文件放在resource目录下。添加几条测试配置
<serverUrls>
<serverUrl url="http://services.arcgisonline.com" matchAll="true"/>
<serverUrl url="https://services.arcgisonline.com" matchAll="true"/>
<serverUrl url="http://www.baidu.com" matchAll="true"/>
</serverUrls>
- proxy.jsp文件放在webapp目录下,没有就在resource同级添加一个webapp目录

4.测试权限验证
-
拦截测试,没有token情况下,是会被拦截的。

-
添加token后访问正常

-
访问静态资源

5. 解决代理的url转义问题
传入的被代理url地址会出现转义的情况,微服务下可能需要添加如下代码
-
?被转义成了%3F

-
ping类型的没有?的路径,后面默认跟了=,此时会报403

proxy.jsp能处理正确的路径是:
...../proxy.jsp?https%3A%2F%2Fservices.arcgisonline.com%2Farcgis%2Frest%2Fservices%2FWorldElevation3D%2FTerrain3D%2FImageServer%2Ftile%2F0%2F0%2F0%3Fsdfasdf=123...../proxy.jsp?ping
此路径在微服务服务之间传递路径时会被转义。所以用这样的步骤处理下。
String originalUri = request.getQueryString();
System.out.println("originalUri = " + originalUri);
try {
if (originalUri.contains("%3F")) {
String str = "";
String[] strings = originalUri.split("%3F");
for (int i = 0; i < strings.length; i++) {
if (i == 0) {
strings[i] = URLDecoder.decode(strings[i], "UTF-8");
}
if (i == 0) {
str += strings[i] + "?";
} else if (i != strings.length - 1) {
str += strings[i] + "%3F";
} else {
str += strings[i];
}
//System.out.println("strings["+i+"] = " + strings[i]);
}
originalUri = str;
} else if (originalUri.endsWith("=")) {
String decode = URLDecoder.decode(originalUri, "UTF-8");
originalUri = decode.substring(0, decode.length() - 1);
}
System.out.println("originalUri decode = " + originalUri);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
_log(Level.INFO, "Creating request for: " + originalUri);

815

被折叠的 条评论
为什么被折叠?



