HttpServletRequest.getParameters()对于空格的处理

本文探讨了在使用HttpServletRequest获取URL参数时,如何处理其中的空格和+号问题。特别是通过实例说明了不同编码方式下参数的正确处理方法,强调了在发送GET请求时对参数进行适当编码的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天才知道原来HttpServletRequest.getParameters()对于空格的处理是这样的!

url: xxx?p=a+b
request.getParameters("p"): a b(a与b中间是空格)

url: xxx?p=a b(a与b中间是空格)
request.getParameters("p"): a b(a与b中间是空格)

url: xxx?p=a%20b
request.getParameters("p"): a b(a与b中间是空格)

url: xxx?p=a%2Bb
request.getParameters("p"): a+b

直接用Get请求的时候,如果参数中有+号或者空格一定要看看是不是应该先encode一下。如果是空格用javascript的escape()就能encode,如果是+号就得自己转了。

<el-table v-loading="loading" :data="nasList"> <el-table-column label="deptId" align="center" prop="deptId"> </el-table-column> <el-table-column label="fileName" align="center" prop="fileName"> <template #default="scope"> <el-link type="primary" @click="handleDownload(scope.row)"> {{ scope.row.fileName }} </el-link> </template> </el-table-column> <el-table-column label="userName" align="center" prop="username"> </el-table-column> </el-table> function handleDownload(row) { // 使用GET请求 window.open( `http://127.0.0.1:9404/upload/download?fileName=${encodeURIComponent( row.fileName )}`, "_blank" ); } // 斷點下載(支援 Range) @GetMapping("/download") public void download(@RequestParam String fileName, HttpServletRequest req, HttpServletResponse resp) throws IOException { fileUploadService.download(fileName, req, resp); } public void download(String fileName, HttpServletRequest req, HttpServletResponse resp) throws IOException { init(); try (DiskShare share = (DiskShare) session.connectShare(SHARE_NAME)) { String nasPath = NAS_UPLOAD_PATH + "/" + fileName; if (!share.fileExists(nasPath)) { resp.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } //获取到目标文件夹 com.hierynomus.smbj.share.File remoteFile; try { remoteFile = share.openFile(nasPath, EnumSet.of(AccessMask.GENERIC_WRITE), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OVERWRITE_IF, null); } catch (Exception e) { log.error("Error opening remote file for writing: {}", nasPath, e); throw new IOException("Failed to open file for writing: " + nasPath); } long fileLength = remoteFile.getFileInformation().getStandardInformation().getEndOfFile(); String range = req.getHeader("Range"); long start = 0, end = fileLength - 1; if (range != null && range.startsWith("bytes=")) { String[] parts = range.replace("bytes=", "").split("-"); start = Long.parseLong(parts[0]); if (parts.length > 1 && !parts[1].isEmpty()) end = Long.parseLong(parts[1]); resp.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); } else { resp.setStatus(HttpServletResponse.SC_OK); } long contentLength = end - start + 1; resp.setHeader("Content-Type", "application/octet-stream"); resp.setHeader("Content-Length", String.valueOf(contentLength)); resp.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength); resp.setHeader("Accept-Ranges", "bytes"); try (InputStream smbIn = remoteFile.getInputStream(); ServletOutputStream out = resp.getOutputStream()) { smbIn.skip(start); // 跳过开始位置 byte[] buffer = new byte[8192]; long remaining = contentLength; int len; while ((len = smbIn.read(buffer, 0, (int) Math.min(buffer.length, remaining))) > 0) { out.write(buffer, 0, len); remaining -= len; } out.flush(); } NasFileInfo fileInfo = fileInfoMapper.selectOne( new LambdaQueryWrapper<NasFileInfo>().eq(NasFileInfo::getFileName, fileName) ); if (fileInfo != null) { NasDownloadLog log = new NasDownloadLog(); log.setFileId(fileInfo.getId()); log.setFileName(fileName); log.setUsername(SecurityUtils.getUsername()); // 自行實作獲取使用者名稱 log.setIpAddress(req.getRemoteAddr()); log.setUserAgent(req.getHeader("User-Agent")); log.setDownloadTime(LocalDateTime.now()); nasDownloadLogMapper.insert(log); } } } 这是一个点击前端触发下载的全过程 10:08:39.416 [com.alibaba.nacos.client.remote.worker.0] INFO c.a.n.client.naming - [onConnected,90] - Grpc connection connect 10:08:39.416 [com.alibaba.nacos.client.naming.grpc.redo.0] ERROR c.a.n.c.r.client - [printIfErrorEnabled,102] - Send request fail, request = InstanceRequest{headers={app=unknown}, requestId='null'}, retryTimes = 0, errorMessage = java.util.concurrent.ExecutionException: com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: Channel shutdown invoked 10:08:39.438 [XNIO-1 task-2] ERROR c.r.c.s.h.GlobalExceptionHandler - [handleRuntimeException,112] - 请求地址'/upload/download',发生未知异常. com.hierynomus.mssmb2.SMBApiException: STATUS_INVALID_PARAMETER (0xc000000d): Create failed for \\10.32.5.80\AnyshareBAK\\upload\bsc_template_1752474167013.xlsx at com.hierynomus.smbj.share.Share.receive(Share.java:371) at com.hierynomus.smbj.share.Share.sendReceive(Share.java:351) at com.hierynomus.smbj.share.Share.createFile(Share.java:159) at com.hierynomus.smbj.share.DiskShare.createFileAndResolve(DiskShare.java:97) at com.hierynomus.smbj.share.DiskShare.resolveAndCreateFile(DiskShare.java:79) at com.hierynomus.smbj.share.DiskShare.open(DiskShare.java:66) at com.hierynomus.smbj.share.DiskShare.exists(DiskShare.java:193) at com.hierynomus.smbj.share.DiskShare.fileExists(DiskShare.java:172) at com.ruoyi.nas.service.FileUploadService.download(FileUploadService.java:198) at com.ruoyi.nas.controller.FileUploadController.download(FileUploadController.java:55)后端提示错误
最新发布
07-24
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值