高德地图JSAPI 2.0使用Java代码代替Nginx进行反向代理

1.背景

最近使用高德地图开发地图功能
新申请的key和密钥配置到原来的代码中,发现怎么都不行,但是使用原来的key和密钥是可以的
然后重新阅读了高德的文档 发现高德地图JSAPI升级到了v2.0 因JSAPI鉴权升级上线,控制台新申请的Key同时会生成一个安全密钥一起使用
这时就需要使用到2.0的验证方式了 可以参考开发文档 https://lbs.amap.com/api/javascript-api/guide/abc/prepare
但这是需要配置Nginx反向代理进行配置 这样我们的key和密钥就分离了 多个key和密钥就需要配置多个Nginx代理
从考虑服务器成本的角度来说 这个开销有点大 后面突发奇想 是否能使用后端代码进行反向代理 此时就开始与度娘约会了

2.反向代理

反向代理(Reverse Proxy)方式是指代理服务器来接受网络上的请求,然后将请求转发给目标服务器,并将目标服务器上返回的结果回传给请求的客服端,此时的代理服务器对外就表现为一个反向代理服务器
一般来说 反向代理服务器会接收请求 但自身不处理请求业务 而是对请求经过一下处理 如记录日志 缓存数据 或身份验证等 然后再将请求转发到相应的应用服务器中进行处理 最后将结果返回

3.smiley-http-proxy-servlet 反向代理

在与度娘约会的过程中,发现了smiley-http-proxy-servlet
http-proxy-servlet 是基于filter进行服务代理 只需要进行相关配置即可代理
smiley-http-proxy-servlet的详见不过多赘述 可自行找度娘约会

4.代码应用

4.1导入smiley-http-proxy-servlet

<dependency>
  <groupId>org.mitre.dsmiley.httpproxy</groupId>
  <artifactId>smiley-http-proxy-servlet</artifactId>
  <version>1.12.1</version>
</dependency>

4.2 注册servlet组件 (ServletRegistrationBean)

按照高德配置Nginx的标准 将/_AMapService/*请求 使用ProxyServlet 进行代理

    @Bean
    public ServletRegistrationBean servletRegistrationAMapService() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), "/_AMapService/*");
        servletRegistrationBean.setName("AMapService");
        servletRegistrationBean.addInitParameter(ProxyServlet.P_TARGET_URI, "https://restapi.amap.com");
        servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, Boolean.FALSE.toString());
        return servletRegistrationBean;
    }

4.3 在Filter拦截器中对_AMapService的请求拼接jscode


    private final String AMapJSCode = "xxxxxxxxxxxxx";

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE,OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        StringBuilder allowHeaders = new StringBuilder();
        allowHeaders.append("accept,content-type,origin,referer,user-agent,Accept,Content-Type,Origin,Referer,User-Agent,Content-MD5,Authentication");
        response.setHeader("Access-Control-Allow-Headers", allowHeaders.toString());
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Expose-Headers", "version");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json;charset=utf-8");
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
            // 设置跨域配置
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            // 此处为核心代码 将jscode参数进行拼接
            String requestURI = request.getRequestURI();
            log.info("requestURI>>>{}", requestURI);
            boolean isAdd = requestURI.contains("_AMapService");
            HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {
                @Override
                public String getQueryString() {
                    if (isAdd) {
                        return (super.getQueryString() + "&jscode=" + AMapJSCode);
                    }
                    return super.getQueryString();
                }
            };
            filterChain.doFilter(requestWrapper, response);
        }
    }

5.源码下载

https://gitee.com/shechaojin/amap-proxy-demo

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值