第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

servlet/rest 控制器下載 log4j 日志文件內(nèi)容沒有完全結(jié)束

servlet/rest 控制器下載 log4j 日志文件內(nèi)容沒有完全結(jié)束

不負(fù)相思意 2021-10-13 13:41:03
在 Spring Web 應(yīng)用程序中(盡管我認(rèn)為這與 Spring 無關(guān)),我創(chuàng)建了一個(gè) REST GET 資源,它允許下載當(dāng)前的 log4j2 文件內(nèi)容,但是請求(來自瀏覽器和 cUrl)不會(huì)以webapp 部署在遠(yuǎn)程生產(chǎn)服務(wù)器上——而它們通常在我的 Windows 開發(fā)機(jī)器上結(jié)束。此外,cUrl 說還有字節(jié)要接收:* transfer closed with 3 bytes remaining to read* stopped the pause stream!* Closing connection 0curl: (18) transfer closed with 3 bytes remaining to read這是相關(guān)代碼:// ...import org.springframework.http.HttpHeaders;// ...@RestController@RequestMapping(path="/logs", produces="application/json")public class LogController {    // ...     @GetMapping(path="/{appenderName}/contents", produces="text/plain")    public void download(@PathVariable String appenderName, HttpServletResponse response) {        // ...        org.apache.logging.log4j.Logger rootLogger = LogManager.getRootLogger();        if(rootLogger instanceof Logger) {            Logger l = (Logger) rootLogger;            if(l.getAppenders().containsKey(appenderName)) {                Appender appender = l.getAppenders().get(appenderName);                if(appender instanceof FileAppender) {                    ((FileAppender) appender).getManager().flush();                    final File f = new File(((FileAppender) appender).getFileName());                    response.setHeader(HttpHeaders.CONTENT_TYPE, "text/plain");                    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + f.getName() + "\"");                    Path tempCopy = Files.createTempFile("log-", null);                    Files.copy(f.toPath(), tempCopy, StandardCopyOption.REPLACE_EXISTING);我認(rèn)為問題出在Content-length標(biāo)題上:在 Linux (Ubuntu) 服務(wù)器上,只有當(dāng)我減去3文件長度時(shí)才有效:response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(tempCopy.toFile().length() - 3));我嘗試在下載前將原始文件復(fù)制到臨時(shí)文件,但似乎沒有幫助。當(dāng)然,如果我不發(fā)送任何Content-Length標(biāo)題,一切都很好。
查看完整描述

2 回答

?
動(dòng)漫人物

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊

我解決了在Content-Type標(biāo)題中指定字符集的問題:

response.setHeader(HttpHeaders.CONTENT_TYPE, "text/plain; charset=utf-8");

沒有它,Linux 服務(wù)器正在返回:

Content-Type: text/plain;charset=ISO-8859-1


查看完整回答
反對 回復(fù) 2021-10-13
?
慕少森

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊

看起來像cURL相關(guān)的問題,這是因?yàn)镃ontent-Disposition標(biāo)題的filename部分(這里的問題是關(guān)于日志的文件名格式,主要是日期部分)。


Content-Disposition應(yīng)該形成的方式最初由RFC 2047和RFC 2231描述;所以設(shè)置filename部分的正確方法是對其進(jìn)行編碼:


String fileName = URLEncoder.encode(f.getName(), "UTF-8");

response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");

附加信息

順便說一句,后來的RFC 5987引入了在可選的“擴(kuò)展”參數(shù)中使用編碼的可能性(filename*在我們的例子中);現(xiàn)代瀏覽器都支持它。


它使您可以添加可選的“擴(kuò)展”參數(shù):


Content-Disposition: attachment;

                     filename="EURO rates";

                     filename*=utf-8''%e2%82%ac%20rates

這里支持RFC 5987 的用戶代理將使用filename*參數(shù),而舊的用戶代理將忽略它并filename改為使用。


查看完整回答
反對 回復(fù) 2021-10-13
  • 2 回答
  • 0 關(guān)注
  • 172 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號