在 url 中直接输入 .xhtml 时如何强制使用 .jsf 文件扩展名

How to force .jsf file extension when .xhtml is typed directly in url

使用 JSF 时,可以从多个扩展中进行选择,例如:

  1. /面孔/*
  2. *.jsf
  3. *.xhtml

最后一个至少推荐用于 JSF 2.2。 但是如果我想使用 .jsf 扩展怎么办,我在这里遇到一个问题,如果有人输入 "curiosity" .xhtml 那么奇怪的事情可能会开始发生,例如你将 JSF 标签与普通 HTML 标签混合。

所以我知道 GlassFish 服务器的管理控制台会强制将 URL 重写为 .jsf 如果我键入 .xhtml,我该怎么做?

两种方式:

  1. 简单地限制直接访问web.xml中的.xhtml个文件。

    <security-constraint>
        <display-name>Restrict direct access to XHTML files</display-name>
        <web-resource-collection>
            <web-resource-name>XHTML files</web-resource-name>
            <url-pattern>*.xhtml</url-pattern>
        </web-resource-collection>
        <auth-constraint />
    </security-constraint> 
    

    另见 JSF returns blank/unparsed page with plain/raw XHTML/XML/EL source instead of rendered HTML output

  2. 创建一个 servlet filter 监听 *.xhtml 并重定向到 *.jsf.

    @WebFilter("*.xhtml")
    public class FacesUrlRewriteFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
    
            String redirectURI = request.getRequestURI().replaceAll("xhtml$", "jsf");
            String queryString = request.getQueryString();
    
            if (queryString != null) {
                redirectURI += "?" + queryString;
            }
    
            response.sendRedirect(redirectURI);
        }
    
        // ...
    }
    

    另见 How to use a servlet filter in Java to change an incoming servlet request url?