Thymeleaf 教程

GTVGFilter.java

thymeleafexamples.gtvg.web.filter.GTVGFilter 源代码:

package thymeleafexamples.gtvg.web.filter;

import java.io.IOException;
import java.io.Writer;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.thymeleaf.ITemplateEngine;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.WebApplicationTemplateResolver;
import org.thymeleaf.web.IWebApplication;
import org.thymeleaf.web.IWebExchange;
import org.thymeleaf.web.IWebRequest;
import org.thymeleaf.web.servlet.JakartaServletWebApplication;
import thymeleafexamples.gtvg.business.entities.User;
import thymeleafexamples.gtvg.web.controller.IGTVGController;
import thymeleafexamples.gtvg.web.mapping.ControllerMappings;

/**
 * 过滤器
 * @author Administrator
 */
public class GTVGFilter implements Filter {
    private ITemplateEngine templateEngine;
    private JakartaServletWebApplication application;

    public GTVGFilter() {
        super();
    }

    /**
     * 添加用户信息到 session
     * @param request
     */
    private static void addUserToSession(final HttpServletRequest request) {
        // Simulate a real user session by adding a user object
        request.getSession(true).setAttribute("user",
                new User("John", "Apricot", "Antarctica", null));
    }

    /**
     * 初始化
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
        this.application =
                JakartaServletWebApplication.buildApplication(filterConfig.getServletContext());
        this.templateEngine = buildTemplateEngine(this.application);
    }

    /**
     * 过滤器
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response,
                         final FilterChain chain) throws IOException, ServletException {
        addUserToSession((HttpServletRequest)request);
        if (!process((HttpServletRequest)request, (HttpServletResponse)response)) {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        // nothing to do
    }

    /**
     * 处理器,根据URL选择合适的处理器
     * @param request
     * @param response
     * @return
     * @throws ServletException
     */
    private boolean process(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException {
        try {
            final IWebExchange webExchange = this.application.buildExchange(request, response);
            final IWebRequest webRequest = webExchange.getRequest();

            // 忽略 css、图片等资源
            if (webRequest.getPathWithinApplication().startsWith("/css") ||
                    webRequest.getPathWithinApplication().startsWith("/images") ||
                    webRequest.getPathWithinApplication().startsWith("/favicon")) {
                return false;
            }

            // 根据请求URL地址匹配合适的处理器
            final IGTVGController controller = ControllerMappings.resolveControllerForRequest(webRequest);
            if (controller == null) {
                return false;
            }

            // 设置响应头
            response.setContentType("text/html;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);

            // 调用处理器
            final Writer writer = response.getWriter();
            controller.process(webExchange, this.templateEngine, writer);

            return true;
        } catch (final Exception e) {
            try {
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            } catch (final IOException ignored) {
                // Just ignore this
            }
            throw new ServletException(e);
        }

    }

    /**
     * 构建模板引擎
     * @param application
     * @return
     */
    private static ITemplateEngine buildTemplateEngine(final IWebApplication application) {
        final WebApplicationTemplateResolver templateResolver = new WebApplicationTemplateResolver(application);

        // HTML是默认模式,但为了更好地理解代码,我们将对其进行设置
        templateResolver.setTemplateMode(TemplateMode.HTML);
        // 这会将 “home” 转换为 “/WEB-INF/Templates/home.html”
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        // 将模板缓存TTL设置为1小时。如果未设置,条目将驻留在缓存中,直到被LRU驱逐
        templateResolver.setCacheTTLMs(Long.valueOf(3600000L));

        // 默认情况下,缓存设置为 true。如果希望模板在修改时自动更新,请设置为 false。
        templateResolver.setCacheable(false);

        final TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);

        return templateEngine;
    }

}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号