11

サーブレットの応答で content-disposition ヘッダーを設定しようとしていますが、ブラウザーでこのエラーが発生します。私は何をすべきか?

サーバーから重複したヘッダーを受信しました

サーバーからの応答に重複したヘッダーが含まれていました。この問題は、通常、Web サイトまたはプロキシの構成ミスが原因です。この問題を解決できるのは、Web サイトまたはプロキシの管理者だけです。

エラー 349 (net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): 複数の異なる Content-Disposition ヘッダーを受信しました。これは、HTTP 応答分割攻撃から保護するために許可されていません。

ここに私のサーブレットコントローラ:

@RequestMapping("/**/paymentOrderReport.pdf")
public class PaymentOrderReportViewController extends org.springframework.web.servlet.mvc.AbstractController {
    
    private PaymentDao paymentDao;
    private JasperPdfView pdfView;

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {

        response.setContentType("application/pdf");
        response.setHeader("Content-disposition", "attachment; filename=" + "report.pdf");

        PaymentOrderEntity paymentOrderEntity = null;
        String traceCode = request.getParameter(ParamConstants.TRACE_CODE);

        if (traceCode != null) {
            PaymentSheetRequestEntity payRequestEntity = paymentDao.loadByUniqueProperty(PaymentSheetRequestEntity.PROP_TRACE_CODE,
                    traceCode);
            if (payRequestEntity != null) {
                paymentOrderEntity = payRequestEntity.getPaymentOrder();
            }
        }

        if (paymentOrderEntity != null) {
            List<PaymentOrderEntity> result = new ArrayList<PaymentOrderEntity>();
            result.add(paymentOrderEntity);
            JRDataSource jrDataSource = new JRBeanCollectionDataSource(result);

            Map<String, Object> model = new HashMap<String, Object>();
            model.put("reportData", jrDataSource);

            return new ModelAndView(pdfView, model);
        }
        return null;
    }
    
    public void setPaymentDao(PaymentDao paymentDao) {
        this.paymentDao = paymentDao;
    }

    public void setPdfView(JasperPdfView pdfView) {
        this.pdfView = pdfView;
    }
}

JasperPdfView クラス:

public class JasperPdfView extends AbstractJasperReportsView {
    
    @Override
    protected void renderReport(JasperPrint populatedReport, Map<String, Object> model, HttpServletResponse response) throws Exception {
        JRPdfExporter jrPdfExporter = new JRPdfExporter();
        if (getConvertedExporterParameters() != null) {
            jrPdfExporter.setParameters(getConvertedExporterParameters());
        }
        jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, populatedReport);
        jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream());
        jrPdfExporter.exportReport();
    }
    
}
4

3 に答える 3

29

ファイル名にコンマが含まれるファイルをダウンロードすると、Google Chrome でこのエラー メッセージが表示されることがあります。ファイル名として本当に「report.pdf」だけを使用していましたか?

HTTP 仕様を読んだ後、Content-Disposition ヘッダー (HTTP 仕様自体の一部ではない) には、2 つの異なるヘッダーの区切りとして扱われるため、コンマ文字を含めないでください。

同じフィールド名を持つ複数のメッセージ ヘッダー フィールドは、そのヘッダー フィールドのフィールド値全体がコンマ区切りのリスト [つまり、#(値)] として定義されている場合にのみ、メッセージに存在する場合があります。メッセージのセマンティクスを変更せずに、複数のヘッダー フィールドを 1 つの「フィールド名: フィールド値」のペアに結合できなければなりません。これには、後続の各フィールド値を最初のフィールド値に追加し、それぞれをコンマで区切ります。

したがって、ファイル名が report,May2014.pdf の場合、Chrome は解釈します。

Content-Disposition: attachment; filename=report,May2014.pdf

同じ http メッセージ ヘッダーの 2 つの値として

Content-Disposition: attachment; filename=report

Content-Disposition: May2014.pdf

これは、 HTTP 応答分割攻撃として解釈されます。これは、おそらく、単一の HTTP 応答に複数の Content-Disposition ヘッダー値が実際に存在しないためです。

他のブラウザは、ファイル名のカンマを気にしないようです。

于 2014-05-26T10:30:07.957 に答える
1

同様の議論がここにあります - http://productforums.google.com/forum/#!topic/chrome/hhZh_kpei8U

それが役立つかどうかを確認してください

于 2013-06-05T05:55:47.780 に答える