springboot+itextpdf+thymeleaf+ognl根据静态模版文件实现动态生成pdf文件并导出demo

news2024/9/26 1:28:03

第一步:导入maven依赖

<!-- 导出为PDF依赖包 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>3.1.12</version>
        </dependency>

第二步:制作thymeleaf静态模版文件并放置在resources目录下,可以自定义模版文件路径

如图所示

thymeleaf静态文件示例(附,在线实时制作预览html文件网址:https://www.jyshare.com/front-end/61/):
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">

<head>
    <meta charset="utf-8"/>
    <title>xxxx模版</title>

    <style>

        #mainTable {
            border-collapse: collapse;
            border-style: solid;
            border-width: 0.5pt;
            width: 100%;
        }

        #mainTable td{
            text-align: center;
            padding: 8px;
            border-style: solid;
            border-width: 0.5pt;
        }
    </style>
</head>

<body>
    <table id="header" boder="0" cellpadding="0" cellspacing="0" width="100%" style="margin-bottom:10px;margin-top:10px;">
        <tbody>
            <tr>
                <td id="img" rowspan="3"><img th:src="${xxxx}" style="border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;-ms-border-radius: 50%;-o-border-radius: 50%;width: 60%;height: 60%;"/></td>
                <td id="mainTitle" colspan="5" th:text="'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+${xxxx}" style="font-size: 30px;font-style: '+';font-weight: bold;padding-left:30%;padding-bottom:10px;"></td>
            </tr>
            <tr>
                <td></td>
                <td id="xxxx" colspan="5" th:text="${xxxx}+哈哈" style="font-size: 30px;font-style: '+';font-weight: bold;padding-left:45%;padding-top:10px;"></td>
            </tr>
            <tr>
                <td></td>
                <td id="xxxx" colspan="5" style="text-align:right;padding-right:0px;">xxxx: <span  th:text="${xxxx}"></span></td>
            </tr>
        </tbody>
    </table>

    <table id="mainTable">
        <tbody>
            <tr>
                <td>xxxx</td>
                <td th:text="${xxxx}"></td>
                <td>xxxx</td>
                <td th:text="${xxxx}"></td>
                <td>xxxx</td>
                <td th:text="${xxxx} + ${xxxx}"></td>
            </tr>
            <tr>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx}"></td>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx}"></td>
            </tr>
            <tr>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx}"></td>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx}"></td>
            </tr>

            <tr>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx} + '/' + ${xxxx}"></td>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx}"></td>
            </tr>
            <tr>
                <td>xxxx</td>
                <td colspan="5" style="text-align:left;" th:text="${xxxx}"></td>
            </tr>
            <tr>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx}"></td>
                <td>xxxx</td>
                <td colspan="2" th:text="${xxxx}"></td>
            </tr>
            <tr>
                <td height="250">xxxx</td>
                <td colspan="5" style="text-align:left;" th:text="${xxxxx}"></td>
            </tr>
            <tr>
                <td height="250">xxxx</td>
                <td colspan="5" style="text-align:left;" th:text="${xxxx}"></td>
            </tr>
            <tr>
                <td>xxxx</td>
                <td colspan="5" style="text-align:left;"><img th:src="${xxxx}" style="width: 50%;height: 30%;"/></td>
            </tr>
        </tbody>
    </table>

    <div style="margin-top:40px;">
        <p>注:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        </p>
    </div>


</body>

</html>

第三步:实现编写生成pdf与下载工具,注意区分项目格式是war包还是jar包,目前我这边是两套实现方案。

jar包的方案是否同样适用于war包,我这边没有尝试,有兴趣的可以自己尝试,然后在评论区分享一下。

1)在jar包环境下加载静态模版文件时的代码示例:

静态模版无需加载包含base64格式的图片内容时,可用以下代码处理:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

/**
 * @author leon
 * @date 2023/8/15
 * @description pdf 模版下载工具
 *
 */
@Component
@Slf4j
public class PdfTemplateDownload {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 下载pdf模版
     * @param response
     * @param paramMap
     * @param templateFileName
     * @param outputFileName
     */
    public void downloadPdfTemplate(HttpServletResponse response,
                                    Map<String, Object> paramMap,
                                    String templateFileName,
                                    String outputFileName) {
        try {
            // 创建基于类路径资源的模板解析器
            SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
            resolver.setApplicationContext(applicationContext); // 你需要注入Spring的应用上下文
            resolver.setTemplateMode(TemplateMode.HTML);
            resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
            resolver.setCacheable(true); // 在开发阶段设置为false,生产环境可改为true
            resolver.setPrefix("classpath:/file/");
            resolver.setSuffix(".html");

            // 创建模版引擎
            TemplateEngine engine = new TemplateEngine();
            engine.setTemplateResolver(resolver);

            // 填充变量参数
            Context context = new Context();
            paramMap.forEach((k,v) -> context.setVariable(k, v));
            // 替换变量值
            String output = engine.process(templateFileName, context);

            // 设置导出文件名
            String exportName = "attachment;filename="+outputFileName;
            response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));
            response.setContentType("application/mspdf");
            response.setCharacterEncoding("utf-8");

            // 新建Document对象
            Document document = new Document(PageSize.A4);
            // 新建PdfWriter对象
            PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
            // 打开文档
            document.open();
            // 读取html文件内容
            InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(StandardCharsets.UTF_8));
            // 使用XMLWorkerHelper将html内容转为pdf
            XMLWorkerHelper xmlWorkerHelper = XMLWorkerHelper.getInstance();
            xmlWorkerHelper.parseXHtml(pdfWriter, document, htmlInputStream, Charset.forName("UTF-8"), new AsianFontProvider());
            // 关闭文档
            document.close();
            // 关闭输入流
            htmlInputStream.close();
            // 关闭文件输出流
            IOUtils.closeQuietly(response.getOutputStream());
        }
        catch (IOException e) {
            log.error("", e);
        }
        catch (DocumentException e) {
            log.error("", e);
        }
    }

    /**
     * 用于中文显示的Provider
     */
    class AsianFontProvider extends XMLWorkerFontProvider {
        @Override
        public Font getFont(final String fontname, String encoding, float size, final int style) {
            try {
                BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                return new Font(bfChinese, size, style);
            }
            catch (Exception e) {
            }
            return super.getFont(fontname, encoding, size, style);
        }
    }


    
}
若静态模版中有base64格式的图片信息,可换用下边的方法实现

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFilesImpl;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.HTML;
import com.itextpdf.tool.xml.html.TagProcessorFactory;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

/**
 * @author leon
 * @date 2023/8/15
 * @description pdf 模版下载工具
 *
 */
@Component
@Slf4j
public class PdfTemplateDownload {


    @Autowired
    private ApplicationContext applicationContext;

    

    /**
     * 下载pdf模版,用于模版中需要展示base64格式的图片信息
     * @param response
     * @param paramMap
     * @param templateFileName
     * @param outputFileName
     */
    public void downloadPdfTemplateForBase64Img(HttpServletResponse response,
                                    Map<String, Object> paramMap,
                                    String templateFileName,
                                    String outputFileName) {
        try {
            // 创建基于类路径资源的模板解析器
            SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
            resolver.setApplicationContext(applicationContext); // 你需要注入Spring的应用上下文
            resolver.setTemplateMode(TemplateMode.HTML);
            resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
            resolver.setCacheable(true); // 在开发阶段设置为false,生产环境可改为true
            resolver.setPrefix("classpath:/file/");
            resolver.setSuffix(".html");

            // 创建模版引擎
            TemplateEngine engine = new TemplateEngine();
            engine.setTemplateResolver(resolver);

            // 填充变量参数
            Context context = new Context();
            paramMap.forEach((k,v) -> context.setVariable(k, v));
            // 替换变量值
            String output = engine.process(templateFileName, context);

            // 设置导出文件名
            String exportName = "attachment;filename="+outputFileName;
            response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));
            response.setContentType("application/pdf");
            response.setCharacterEncoding("utf-8");

            // 新建Document对象
            Document document = new Document(PageSize.A4);
            // 新建PdfWriter对象
            PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
            // 打开文档
            document.open();
            // 自定义处理base64图片
            final TagProcessorFactory htmlTagProcessorFactory = Tags.getHtmlTagProcessorFactory();
            htmlTagProcessorFactory.removeProcessor(HTML.Tag.IMG);
            htmlTagProcessorFactory.addProcessor(new ImageTagProcessor(),HTML.Tag.IMG);

            final Charset charset = StandardCharsets.UTF_8;
            final CssFilesImpl cssFiles = new CssFilesImpl();
            cssFiles.add(XMLWorkerHelper.getInstance().getDefaultCSS());
            final StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);
            final HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new AsianFontProvider()));
            hpc.setAcceptUnknown(true).autoBookmark(true).setTagFactory(htmlTagProcessorFactory);
            final HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, pdfWriter));
            final Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
            final XMLWorker worker = new XMLWorker(pipeline, true);
            final XMLParser p = new XMLParser(true, worker, charset);
            // 读取html文件内容
            InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(charset));
            p.parse(htmlInputStream, charset);

            // 关闭文档
            document.close();
            // 关闭输入流
            htmlInputStream.close();
            // 关闭文件输出流
            IOUtils.closeQuietly(response.getOutputStream());
        }
        catch (IOException e) {
            log.error("", e);
        }
        catch (DocumentException e) {
            log.error("", e);
        }
    }

    /**
     * 用于中文显示的Provider
     */
    class AsianFontProvider extends XMLWorkerFontProvider {
        @Override
        public Font getFont(final String fontname, String encoding, float size, final int style) {
            try {
                BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                return new Font(bfChinese, size, style);
            }
            catch (Exception e) {
            }
            return super.getFont(fontname, encoding, size, style);
        }
    }


   

}

2)在war包环境下加载静态模版文件时的代码示例:

包含了静态模版中需要加载与不需要加载base64格式的图片内容时的两个方法实现示例:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFilesImpl;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.HTML;
import com.itextpdf.tool.xml.html.TagProcessorFactory;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import com.wondersgroup.healthcloud.exception.CommonException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.FileTemplateResolver;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

/**
 * @author leon
 * @date 2023/8/15
 * @description pdf 模版下载工具
 *
 */
@Component
@Slf4j
public class PdfTemplateDownload {


    /**
     * 下载pdf模版
     * @param response
     * @param paramMap
     * @param templateFileName
     * @param outputFileName
     */
    public void downloadPdfTemplate(HttpServletResponse response,
                                    Map<String, Object> paramMap,
                                    String templateFileName,
                                    String outputFileName) {
        try {
            URL url = PdfTemplateDownload.class.getClassLoader().getResource("file/"+templateFileName);
            if (ObjectUtils.isEmpty(url)) {
                throw new CommonException("下载模版文件缺失");
            }
            File htmlFile = new File(url.getPath());

            // 创建html文件解析器
            FileTemplateResolver resolver = new FileTemplateResolver();
            resolver.setTemplateMode(TemplateMode.HTML);
            resolver.setSuffix(".html");

            // 创建模版引擎
            TemplateEngine engine = new TemplateEngine();
            engine.setTemplateResolver(resolver);

            // 填充变量参数
            Context context = new Context();
            paramMap.forEach((k,v) -> context.setVariable(k, v));
            // 替换变量值
            String output = engine.process(htmlFile.getAbsolutePath(), context);

            // 设置导出文件名
            String exportName = "attachment;filename="+outputFileName;
            response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));
            response.setContentType("application/pdf");
            response.setCharacterEncoding("utf-8");

            // 新建Document对象
            Document document = new Document(PageSize.A4);
            // 新建PdfWriter对象
            PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
            // 打开文档
            document.open();
            // 读取html文件内容
            InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(StandardCharsets.UTF_8));
            // 使用XMLWorkerHelper将html内容转为pdf
            XMLWorkerHelper xmlWorkerHelper = XMLWorkerHelper.getInstance();
            xmlWorkerHelper.parseXHtml(pdfWriter, document, htmlInputStream, Charset.forName("UTF-8"), new AsianFontProvider());
            // 关闭文档
            document.close();
            // 关闭输入流
            htmlInputStream.close();
            // 关闭文件输出流
            IOUtils.closeQuietly(response.getOutputStream());
        }
        catch (IOException e) {
            log.error("", e);
        }
        catch (DocumentException e) {
            log.error("", e);
        }
    }



    /**
     * 下载pdf模版,用于模版中需要展示base64格式的图片信息
     * @param response
     * @param paramMap
     * @param templateFileName
     * @param outputFileName
     */
    public void downloadPdfTemplateForBase64Img(HttpServletResponse response,
                                    Map<String, Object> paramMap,
                                    String templateFileName,
                                    String outputFileName) {
        try {
            URL url = PdfTemplateDownload.class.getClassLoader().getResource("file/"+templateFileName);
            if (ObjectUtils.isEmpty(url)) {
                throw new CommonException("下载模版文件缺失");
            }
            File htmlFile = new File(url.getPath());

            // 创建html文件解析器
            FileTemplateResolver resolver = new FileTemplateResolver();
            resolver.setTemplateMode(TemplateMode.HTML);
            resolver.setSuffix(".html");

            // 创建模版引擎
            TemplateEngine engine = new TemplateEngine();
            engine.setTemplateResolver(resolver);

            // 填充变量参数
            Context context = new Context();
            paramMap.forEach((k,v) -> context.setVariable(k, v));
            // 替换变量值
            String output = engine.process(htmlFile.getAbsolutePath(), context);

            // 设置导出文件名
            String exportName = "attachment;filename="+outputFileName;
            response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));
            response.setContentType("application/pdf");
            response.setCharacterEncoding("utf-8");

            // 新建Document对象
            Document document = new Document(PageSize.A4);
            // 新建PdfWriter对象
            PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
            // 打开文档
            document.open();
            // 自定义处理base64图片
            final TagProcessorFactory htmlTagProcessorFactory = Tags.getHtmlTagProcessorFactory();
            htmlTagProcessorFactory.removeProcessor(HTML.Tag.IMG);
            htmlTagProcessorFactory.addProcessor(new ImageTagProcessor(),HTML.Tag.IMG);

            final Charset charset = StandardCharsets.UTF_8;
            final CssFilesImpl cssFiles = new CssFilesImpl();
            cssFiles.add(XMLWorkerHelper.getInstance().getDefaultCSS());
            final StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);
            final HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new AsianFontProvider()));
            hpc.setAcceptUnknown(true).autoBookmark(true).setTagFactory(htmlTagProcessorFactory);
            final HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, pdfWriter));
            final Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
            final XMLWorker worker = new XMLWorker(pipeline, true);
            final XMLParser p = new XMLParser(true, worker, charset);
            // 读取html文件内容
            InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(charset));
            p.parse(htmlInputStream, charset);

            // 关闭文档
            document.close();
            // 关闭输入流
            htmlInputStream.close();
            // 关闭文件输出流
            IOUtils.closeQuietly(response.getOutputStream());
        }
        catch (IOException e) {
            log.error("", e);
        }
        catch (DocumentException e) {
            log.error("", e);
        }
    }

    /**
     * 用于中文显示的Provider
     */
    class AsianFontProvider extends XMLWorkerFontProvider {
        @Override
        public Font getFont(final String fontname, String encoding, float size, final int style) {
            try {
                BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                return new Font(bfChinese, size, style);
            }
            catch (Exception e) {
            }
            return super.getFont(fontname, encoding, size, style);
        }
    }



}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1539098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全慢速攻击

什么是低速缓慢攻击&#xff1f; 低速缓慢攻击是 DoS 或 DDoS 攻击的一种&#xff0c;依赖一小串非常慢的流量&#xff0c;可以针对应用程序或服务器资源发起攻击。与更传统的蛮力攻击不同&#xff0c;低速缓慢攻击所需的带宽非常小&#xff0c;并且难以防护&#xff0c;因为它…

Day60:WEB攻防-PHP反序列化POP链构造魔术方法流程漏洞触发条件属性修改

目录 PHP-DEMO1-序列化和反序列化 序列化操作 - 即类型转换 序列化案例 PHP-DEMO2-魔术方法触发规则 __construct(): //当对象new的时候会自动调用 __destruct()&#xff1a;//当对象被销毁时会被自动调用 __sleep(): //serialize()执行时被自动调用 __wakeup(): //uns…

程序员表白

啥&#xff1f;&#xff01;你说程序员老实&#xff0c;认真工作&#xff0c;根本不会什么表白&#xff01;那你就错了&#xff01;(除了我) 那今天我们就来讲一下这几个代码&#xff01;赶紧复制下来&#xff0c;这些代码肯定有你有用的时候&#xff01; 1.Python爱心代码 im…

MNN 执行推理(九)

系列文章目录 MNN createFromBuffer&#xff08;一&#xff09; MNN createRuntime&#xff08;二&#xff09; MNN createSession 之 Schedule&#xff08;三&#xff09; MNN createSession 之创建流水线后端&#xff08;四&#xff09; MNN Session 之维度计算&#xff08;五…

墨菲安全在软件供应链安全领域阶段性总结及思考

向外看&#xff1a;墨菲安全在软件供应链安全领域的一些洞察、思考、行动 洞察 现状&挑战&#xff1a; 过去开发安全体系是无法解决软件供应链安全问题的&#xff1b;一些过去专注开发安全领域的厂商正在错误的引导行业用开发安全思维解决软件供应链安全问题&#xff0c;治…

Linux:详解https协议

文章目录 什么是https协议信息窃取常见的加密数据摘要和数据指纹https的工作过程只使用对称加密只使用非对称加密都使用非对称加密非对称加密对称加密 证书数据签名https方案 本篇要总结的内容是关于https协议的相关内容 什么是https协议 在讲述https协议之前&#xff0c;首先…

Linux镜像文件下载地址--SCAS 开源镜像站,速度快

SCAS 开源镜像站 https://mirror.iscas.ac.cn/举例&#xff1a; 下载centos7 Index of /centos/7/isos/x86_64/ (iscas.ac.cn)

【C++算法】二分算法、二分模板详解,四道例题带详细注释

文章目录 [toc]1&#xff09;整数二分2&#xff09;解二分题步骤AcWing 789.数的范围洛谷 P1873.EKO/砍树洛谷 P1678.烦恼的高考志愿 2&#xff09;浮点二分AcWing 790. 数的三次方根 1&#xff09;整数二分 有单调性的题目一定可以二分&#xff0c;但是用二分做的题目不一定拥…

Linux初学(八)磁盘管理

一、磁盘管理 1.1 简介 磁盘的工作原理&#xff1a; 添加磁盘对磁盘进行分区格式化磁盘挂载和使用磁盘 磁盘的类型&#xff1a; 固态机械 磁盘的接口类型&#xff1a; IDESTSTSCSI 磁盘工作的原理&#xff1a; 磁盘&#xff0c;特别是硬盘&#xff0c;和内存不同&#xff0c;…

【Bug】记录2024年遇到的Bug以及修复方案

--------------------------------------------------------分割线 2024.3.22------------------------------------------------------- 1、load_sample_image raise AttributeError(“Cannot find sample image: %s” % image_name) AttributeError: Cannot find sample ima…

nvidia显卡如何安装cuda驱动

目录 查看显卡对应的cuda版本下载与你显卡匹配的CUDA Toolkit 查看显卡对应的cuda版本 按 微软 R 键&#xff0c;输入cmd 然后输入 nvidia-smi &#xff0c;回车显示下面信息&#xff1a; 看到 CUDA Version 为 12.2 下载与你显卡匹配的CUDA Toolkit 打开网页&#xff1a…

鸿蒙Harmony应用开发—ArkTS-@AnimatableExtend装饰器:定义可动画属性

AnimatableExtend装饰器用于自定义可动画的属性方法&#xff0c;在这个属性方法中修改组件不可动画的属性。在动画执行过程时&#xff0c;通过逐帧回调函数修改不可动画属性值&#xff0c;让不可动画属性也能实现动画效果。 可动画属性&#xff1a;如果一个属性方法在animation…

C++默认构造函数(二)

目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…

C++ 其它

1、内存四区-代码区 2、内存四区-全局区 生成exe后&#xff0c;运行前是代码区和全局区 3、内存四区-栈区 4、内存四区-堆区 5、new *new一个整型10&#xff0c;返回的是该数据类型的指针&#xff0c;所以用int p 所以是int [10]&#xff0c;所以new的是int[10]&#x…

3.23项目:聊天室

1、 基于UDP的网络聊天室 项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器 #inc…

东方博宜 1469. 数的统计

东方博宜 1469. 数的统计 #include<iostream> using namespace std; int main() {int n ;cin >> n ;int x ;cin >> x ;int cnt ;cnt 0;for (int i 1 ; i < n ; i){int num ;num i ;while(num!0){int g ;g num % 10 ;if (g x)cnt 1 ;num num / 10…

springboot294基于java的火车票订票系统的设计与实现

火车票订票系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装火车票订票系统软件来发挥其高效…

ElasticSearch首次启动忘记密码,更改密码(Windows 10)

先启动ElasticSearch 启动方式cmd到lasticsearch-8.12.2\bin目录下输入elasticsearch 启动成功后新开一个窗口输入elasticsearch-reset-password -u elastic

《剑指 Offer》专项突破版 - 面试题 88 : 动态规划的基础知识(C++ 实现)

目录 前言 面试题 88 : 爬楼梯的最少成本 一、分析确定状态转移方程 二、递归代码 三、使用缓存的递归代码 四、空间复杂度为 O(n) 的迭代代码 五、空间复杂度为 O(1) 的迭代代码 前言 动态规划是目前算法面试中的热门话题&#xff0c;应聘者经常在各大公司的面试中遇到…

C++ —— 日期计算器

1. 头文件 #pragma once #include <iostream> using namespace std;class Date { public:Date(int year 1, int month 1, int day 1);int GetMonthDay();bool operator>(const Date& d) const;bool operator>(const Date& d)const;bool operator<(c…