• 高德地图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.httpproxygroupId>
      <artifactId>smiley-http-proxy-servletartifactId>
      <version>1.12.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    5.源码下载

    https://download.csdn.net/download/shechaojin/86396986

  • 相关阅读:
    Redis击穿、穿透、雪崩
    Blazor WebAssembly + Grpc Web = 未来?
    Go 接口:深入内部原理
    python——spark入门
    高并发系统架构设计之实战篇:计数系统之计数器设计
    《你不知道的javaScript》中卷——第一部分——第一章——类型
    通过java方式使用Kafka
    基于Yolov8的中国交通标志(CCTSDB)识别检测系统
    腾讯API安全公测重磅开启,你的API安全吗?
    Java Web实现用户登录功能
  • 原文地址:https://blog.csdn.net/shechaojin/article/details/126267635