去掉js缓存,为引入的js添加版本号,使用Thymeleaf 自定义标签方案

作用:在html中,给引用的js文件动态添加版本号,可以去掉js缓存,保证使用的js始终是最新的js 。这次方案是使用自定义标签完成。
不让页面缓存这些文件方法其实很多,但我们经常用的就这几样,这里我用到的是在资源后面加版本号来实现资源不缓存的功能,具体代码如下

package com.nglee.house.config.custom;

import org.springframework.stereotype.Component;
import org.thymeleaf.dialect.AbstractProcessorDialect;
import org.thymeleaf.processor.IProcessor;
import org.thymeleaf.standard.StandardDialect;

import java.util.HashSet;
import java.util.Set;

/**
 * @author ngLee
 * @version 1.0
 * @Desc
 * @date 2021/4/19 21:32
 */
@Component
public class CustomTag extends AbstractProcessorDialect {
    /**
     * 定义方言名称
     */
    private static final String NAME = "系统自定义标签";
    private static final String prefix = "Ngl";
    protected CustomTag() {
        super(NAME, prefix, StandardDialect.PROCESSOR_PRECEDENCE);
    }
    
    @Override
    public Set<IProcessor> getProcessors(final String dialectPrefix) {
        final Set<IProcessor> processor = new HashSet<>();
        //<Fw:select>标签
        processor.add(new CustomTagSelect(prefix));
        return processor;
    }
}
package com.nglee.house.config.custom;

import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;

import org.thymeleaf.templatemode.TemplateMode;

import java.time.Instant;

/**
 * @author ngLee
 * @version 1.0
 * @Desc
 * @date 2021/4/19 21:40
 */
public class CustomTagSelect extends AbstractElementTagProcessor {
    
    @Override
    protected void doProcess(ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, IElementTagStructureHandler iElementTagStructureHandler) {
            //获取src的引用js路径
            String src = iProcessableElementTag.getAttributeValue("src");
            //如果t能加上发包版本号更完美
            //拼接替换后的内容
            StringBuffer content = new StringBuffer("<script type='text/javascript' src="+src+"?t="+Instant.now().getEpochSecond() +"></script>");
            IModelFactory modelFactory = iTemplateContext.getModelFactory();
            IModel model = modelFactory.createModel();
            model.add(modelFactory.createText(content));
            iElementTagStructureHandler.replaceWith(model, false);
    }
    private static final String TAG_NAME="script";
    private static final int PRECEDENCE = 10000;
    public CustomTagSelect(String dialectPrefix) {
        super(
                // 模板类型为HTML
                TemplateMode.HTML,
                // 标签方言前缀
                dialectPrefix,
                // 标签名称
                TAG_NAME,
                // 将标签前缀应用于标签名称
                true,
                // 无属性名称:将通过标签名称匹配
                null,
                // 没有要应用于属性名称的前缀
                false,
                // 优先级
                PRECEDENCE
        );
    }
}

具体使用:

<Ngl:script th:src="@{'/static/js/user/register.js'}" id="s"></Ngl:script>

具体引用效果为:

去掉js缓存,为引入的js添加版本号,使用Thymeleaf 自定义标签方案

上一篇:SpringBoot的WEB流程


下一篇:thymeleaf控制checkbox的value值