From a824fbd8a3972b2af07eb143b8776bc5620539fb Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期日, 19 二月 2023 12:22:35 +0800 Subject: [PATCH] 1 --- src/main/java/com/lf/server/controller/data/WmtsController.java | 99 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 92 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/lf/server/controller/data/WmtsController.java b/src/main/java/com/lf/server/controller/data/WmtsController.java index d72e3d4..8dd9fe8 100644 --- a/src/main/java/com/lf/server/controller/data/WmtsController.java +++ b/src/main/java/com/lf/server/controller/data/WmtsController.java @@ -2,6 +2,7 @@ import com.lf.server.annotation.SysLog; import com.lf.server.config.PropertiesConfig; +import com.lf.server.helper.StringHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -10,13 +11,27 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.web.bind.annotation.*; import javax.servlet.ServletOutputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; import java.io.InputStream; +import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.Date; +import java.util.List; /** * WMTS鏈嶅姟 @@ -67,21 +82,91 @@ @ApiOperation(value = "鑾峰彇WMTS鐡︾墖") @ApiImplicitParams({ @ApiImplicitParam(name = "token", value = "浠ょ墝", required = true, dataType = "String", defaultValue = "token", paramType = "path"), - @ApiImplicitParam(name = "layer", value = "鍥惧眰绫诲瀷", required = true, dataType = "String", defaultValue = "TDTIMG"), - @ApiImplicitParam(name = "tilematrix", value = "灞傜骇", required = true, dataType = "Integer"), - @ApiImplicitParam(name = "tilerow", value = "琛屽彿", required = true, dataType = "Integer"), - @ApiImplicitParam(name = "tilecol", value = "鍒楀彿", required = true, dataType = "Integer") + @ApiImplicitParam(name = "layer", value = "鍥惧眰绫诲瀷", required = true, dataType = "String", defaultValue = "img"), + @ApiImplicitParam(name = "z", value = "灞傜骇", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "x", value = "琛屽彿", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "y", value = "鍒楀彿", required = true, dataType = "Integer") }) @GetMapping("select/{token}/tile") - public void selectWmtsTile(@RequestParam("layer") String layer, @RequestParam("tilematrix") Integer l, @RequestParam("tilerow") Integer r, - @RequestParam("tilecol") Integer c, @RequestParam("format") String format, @PathVariable(name = "token") String token, + public void selectWmtsTile(@RequestParam("LAYER") String layer, @RequestParam("TILEMATRIX") Integer z, @RequestParam("TILEROW") Integer x, + @RequestParam("TILECOL") Integer y, @PathVariable(name = "token") String token, HttpServletRequest req, HttpServletResponse res) { try { // ServletServerHttpRequest ssRequest = new ServletServerHttpRequest(request) - String base = config.getTilePath(); + if (StringHelper.isEmpty(layer) || null == z || null == x || null == y) { + return; + } + + ServletServerHttpRequest ssReq = new ServletServerHttpRequest(req); + ServletServerHttpResponse ssRes = new ServletServerHttpResponse(res); + + // 妫�鏌ョ紦瀛樻槸鍚﹁繃鏈� + if (checkIfNotModify(ssReq, ssRes)) { + // 璁剧疆缂撳瓨澶� + setBrowerCache(ssRes); + return; + } + + // 璁剧疆杩斿洖鍥剧墖绫诲瀷 + res.setContentType("image/png"); + // 璁剧疆缂撳瓨鍙傛暟 + setBrowerCache(ssRes); + // 閫氳繃response瀵硅薄锛岃幏鍙栧埌杈撳嚭娴� + ServletOutputStream outputStream = res.getOutputStream(); + // 瀹氫箟杈撳叆娴侊紝閫氳繃杈撳叆娴佽鍙栨枃浠跺唴瀹� + FileInputStream fileInputStream; + + String path = config.getTilePath() + File.separator + layer + File.separator + z + File.separator + x + File.separator + y + ".png"; + File file = new File(path); + if (!file.exists() || file.isDirectory()) { + ClassPathResource resource = new ClassPathResource("wmts/nofound.png"); + fileInputStream = new FileInputStream(resource.getFile()); + } else { + fileInputStream = new FileInputStream(file); + } + + int len = 0; + byte[] bytes = new byte[1024]; + while ((len = fileInputStream.read(bytes)) != -1) { + // 閫氳繃杈撳叆娴佽鍙栨枃浠舵暟鎹紝鐒跺悗閫氳繃涓婅堪鐨勮緭鍑烘祦鍐欏洖娴忚鍣� + outputStream.write(bytes, 0, len); + outputStream.flush(); + } + + // 鍏抽棴璧勬簮 + outputStream.close(); + fileInputStream.close(); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } + + /** + * 璁剧疆娴忚鍣ㄧ紦瀛樺弬鏁� + */ + private void setBrowerCache(ServerHttpResponse res) { + HttpHeaders headers = res.getHeaders(); + headers.setCacheControl("public, must-revalidate"); + + headers.setExpires(System.currentTimeMillis() + 24 * 60 * 60 * 1000); + headers.setAccessControlMaxAge(Duration.ofHours(24)); + headers.setETag("\"" + new Date().toString() + "\""); + // must-revalidate + // response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); + } + + /** + * 楠岃瘉缂撳瓨鍙傛暟 + */ + boolean checkIfNotModify(ServerHttpRequest req, ServerHttpResponse res) { + List<String> etags = req.getHeaders().getIfNoneMatch(); + if (0 == etags.size() || StringHelper.isEmpty(etags.get(0))) { + return false; + } + + res.setStatusCode(HttpStatus.NOT_MODIFIED); + + return true; + } } -- Gitblit v1.9.3