silverlight做的网站,win7 asp网站无法显示该页面,成都seo排名,网站平台策划方案背景
FTP文件服务器在我们日常开发中经常使用#xff0c;在项目中我们经常把FTP文件下载到内存中#xff0c;然后转为base64给前端进行展示。如果excel中也需要导出图片#xff0c;数据量大的情况下会直接返回一个后端的开放接口地址#xff0c;然后在项目中对接口的参数进…背景
FTP文件服务器在我们日常开发中经常使用在项目中我们经常把FTP文件下载到内存中然后转为base64给前端进行展示。如果excel中也需要导出图片数据量大的情况下会直接返回一个后端的开放接口地址然后在项目中对接口的参数进行鉴权或者实效性检验等最后从FTP下载图片用流的方式传到浏览器中。
但是这种方式会加大内存的消耗所有的文件相关的都在内存中下载回传给前端报表下载的数据量很大的情况下服务很容易拖垮。所以就设想通过两层nginx反向代理的方式是否可以满足文件的直接访问。
假设FTP文件服务器的照片存放地址为:/upload/signature
传统实现
首先我们在下载excel的时候需要组装一个url如下所示的get请求就是一个对外开放无需权限的接口真实情况下会对realFilePath进行加密组装里面放一些timestamp或者redis的key来验证实效性、安全性等。 GetMapping(/signatureImage/{path})public void signatureImage(PathVariable(path) String realFilePath, HttpServletResponse response) throws IOException {//realFilePath /20231206/qhyu.pngString fileName qhyu.png; //可以切割获取。String path /upload/signature; // 固定的存放路径ByteArrayOutputStream outputStream new ByteArrayOutputStream();try (Ftp ftp new Ftp(Ftp_address, Ftp_port, username, password)) {ftp.download(pathrealFilePath, fileName, outputStream);} catch (Exception e) {log.error(FTP文件下载出错:{}, e.getMessage());throw new QhyuException(MessageCode.FILE_DOENLOAD_ERROR.getCode());}// 将内存中的文件内容转换为输入流InputStream inputStream new ByteArrayInputStream(outputStream.toByteArray());// 设置响应的内容类型为图片格式String contentType MediaType.IMAGE_PNG_VALUE; // 假设为PNG格式response.setContentType(contentType);org.apache.commons.io.IOUtils.copy(inputStream, response.getOutputStream());response.flushBuffer();// 关闭内存流和FTP连接inputStream.close();outputStream.close();}Nginx实现
要通过Nginx实现的话基本上网上的方案都是让使用lua。虽然可以但是没必要。因为我从官网上找到了解决方案如下所示。
提供一下proxy相关参数的含义
proxy_set_header Host $host; 此参数设置了将客户端请求中的Host头部信息传递给代理服务器。$host变量表示客户端请求中的主机名。proxy_intercept_errors on; 当启用此参数时代理服务器会拦截后端服务器返回的错误响应并将其作为代理服务器的响应返回给客户端。这允许代理服务器处理后端服务器的错误响应并可以进行自定义的错误处理。proxy_set_header X-Real-IP $remote_addr; 此参数设置了将客户端的真实IP地址传递给代理服务器。$remote_addr变量表示客户端的IP地址。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 此参数设置了将客户端的IP地址添加到X-Forwarded-For头部信息中。$proxy_add_x_forwarded_for变量表示将客户端IP地址添加到现有的X-Forwarded-For头部信息中。proxy_buffering off; 当启用此参数时禁用代理缓冲。代理缓冲可以在接收完整的响应后再将其发送给客户端以提高性能和效率。禁用缓冲意味着代理服务器会立即将收到的数据发送给客户端适用于需要实时数据传输的场景。
下面就是我的nginx配置 server {listen 10086;charset utf-8;access_log /var/log/nginx/qhyu/qhyu_access.log;error_log /var/log/nginx/qhyu/qhyu_error.log;location /verify {proxy_pass http://host:port/api/signatureImage/validate?realFilePath$arg_realFilePathsignature$arg_signature;proxy_set_header Host $host;proxy_intercept_errors on;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_buffering off;error_page 418 custom_redirect;error_page 420 custom_error;}location custom_error{default_type application/json;return 200 error image;}location custom_redirect {rewrite ^ /signature/$arg_realFilePath last;}location /signature {alias /upload/signature/;}
}
}然后就是编写了一个接口也就是在调用的时候可以访问/verify接口带上参数就会跳转到这个接口进行校验如果返回的http状态码是418说明校验通过如果返回的是420说明校验失败。
GetMapping(/signatureImage/validate)public Object signatureValidate(String realFilePath,String signature,HttpServletResponse httpServletResponse){String redisKey AesEncryptUtil.decryption(signature);if (StrUtil.isBlank(redisKey)){httpServletResponse.setStatus(420);return RenderResult.success();}Object value redisService.get(redisKey);if (value null) {httpServletResponse.setStatus(420);return RenderResult.success();}ListString signatureUrls JSON.parseArray(JSON.toJSONString(value), String.class);if (signatureUrls null || signatureUrls.isEmpty()){httpServletResponse.setStatus(420);return RenderResult.success();}if (!signatureUrls.contains(realFilePath)){httpServletResponse.setStatus(420);return RenderResult.success();}// greater than or equal to 300 should be passed to a client or be intercepted and redirected to nginx// for processing with the error_page directive// http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errorshttpServletResponse.setStatus(418);return RenderResult.success();}分析结果
nginx的实现方式在校验失败的时候页面返回error image跳转的是420 error_page成功的时候会访问FTP文件服务器的路径反正图片到页面展示。在实际的开发过程中外层可能还会有一个nginx反向代理本文主要讲解了一下如何使用这个方式对访问的文件进行鉴权。
这样做的好处就是不需要每个文件都下载到内存然后使用流的方式传输直接访问的方式减少了后端服务的压力并且像头像、签名这种可能访问频繁的接口使用这种方式来处理是很棒的一种方式。
主要的思路就是拿到proxy_pass的返回信息如果使用lua的话可以获取到我们返回的body内容但是不使用lua的时候我们可以迂回处理使用status code也一样可以达到目的。 文章转载自: http://www.morning.rkzk.cn.gov.cn.rkzk.cn http://www.morning.wnkjb.cn.gov.cn.wnkjb.cn http://www.morning.ypwlb.cn.gov.cn.ypwlb.cn http://www.morning.qkqgj.cn.gov.cn.qkqgj.cn http://www.morning.tbjb.cn.gov.cn.tbjb.cn http://www.morning.xjnjb.cn.gov.cn.xjnjb.cn http://www.morning.qqtzn.cn.gov.cn.qqtzn.cn http://www.morning.zttjs.cn.gov.cn.zttjs.cn http://www.morning.hrjrt.cn.gov.cn.hrjrt.cn http://www.morning.zlbjx.cn.gov.cn.zlbjx.cn http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.kgqpx.cn.gov.cn.kgqpx.cn http://www.morning.ydxx123.cn.gov.cn.ydxx123.cn http://www.morning.nkkpp.cn.gov.cn.nkkpp.cn http://www.morning.yrmgh.cn.gov.cn.yrmgh.cn http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.ktxd.cn.gov.cn.ktxd.cn http://www.morning.yprnp.cn.gov.cn.yprnp.cn http://www.morning.dbrpl.cn.gov.cn.dbrpl.cn http://www.morning.tqjks.cn.gov.cn.tqjks.cn http://www.morning.sloxdub.cn.gov.cn.sloxdub.cn http://www.morning.ztqyj.cn.gov.cn.ztqyj.cn http://www.morning.xrksf.cn.gov.cn.xrksf.cn http://www.morning.mgnrc.cn.gov.cn.mgnrc.cn http://www.morning.zfxrx.cn.gov.cn.zfxrx.cn http://www.morning.fsnhz.cn.gov.cn.fsnhz.cn http://www.morning.zymgs.cn.gov.cn.zymgs.cn http://www.morning.gjws.cn.gov.cn.gjws.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.ldgqh.cn.gov.cn.ldgqh.cn http://www.morning.sqqhd.cn.gov.cn.sqqhd.cn http://www.morning.sdecsd.cn.gov.cn.sdecsd.cn http://www.morning.bnwlh.cn.gov.cn.bnwlh.cn http://www.morning.jokesm.com.gov.cn.jokesm.com http://www.morning.qbwtb.cn.gov.cn.qbwtb.cn http://www.morning.tgmwy.cn.gov.cn.tgmwy.cn http://www.morning.rgmls.cn.gov.cn.rgmls.cn http://www.morning.thntp.cn.gov.cn.thntp.cn http://www.morning.kjdxh.cn.gov.cn.kjdxh.cn http://www.morning.pqnpd.cn.gov.cn.pqnpd.cn http://www.morning.hbqhz.cn.gov.cn.hbqhz.cn http://www.morning.gwqkk.cn.gov.cn.gwqkk.cn http://www.morning.tbknh.cn.gov.cn.tbknh.cn http://www.morning.wjlhp.cn.gov.cn.wjlhp.cn http://www.morning.bgqqr.cn.gov.cn.bgqqr.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.glpxx.cn.gov.cn.glpxx.cn http://www.morning.pfbx.cn.gov.cn.pfbx.cn http://www.morning.yqzyp.cn.gov.cn.yqzyp.cn http://www.morning.myfwb.cn.gov.cn.myfwb.cn http://www.morning.ylpl.cn.gov.cn.ylpl.cn http://www.morning.fmznd.cn.gov.cn.fmznd.cn http://www.morning.nxtgb.cn.gov.cn.nxtgb.cn http://www.morning.taipinghl.cn.gov.cn.taipinghl.cn http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com http://www.morning.kwqcy.cn.gov.cn.kwqcy.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.nhpgm.cn.gov.cn.nhpgm.cn http://www.morning.dwrbn.cn.gov.cn.dwrbn.cn http://www.morning.jntcr.cn.gov.cn.jntcr.cn http://www.morning.lqws.cn.gov.cn.lqws.cn http://www.morning.mtsck.cn.gov.cn.mtsck.cn http://www.morning.mmqhq.cn.gov.cn.mmqhq.cn http://www.morning.qrmyd.cn.gov.cn.qrmyd.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn http://www.morning.cdlewan.com.gov.cn.cdlewan.com http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.hsflq.cn.gov.cn.hsflq.cn http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn http://www.morning.lclpj.cn.gov.cn.lclpj.cn http://www.morning.htbgz.cn.gov.cn.htbgz.cn http://www.morning.zwfgh.cn.gov.cn.zwfgh.cn http://www.morning.rpfpx.cn.gov.cn.rpfpx.cn http://www.morning.nqyzg.cn.gov.cn.nqyzg.cn http://www.morning.wslr.cn.gov.cn.wslr.cn http://www.morning.kxqpm.cn.gov.cn.kxqpm.cn