springboot2.1.13+thymeleaf3.0.11+sitemesh3.0.1踩坑

上述三個東西就不簡介了,直接說遇到的問題:

sitemesh中的裝飾頁面使用thymeleaf標籤,最後渲染到頁面上不能解析。

猜想原因:兩者都是Filter,都是通過修改響應內容來替換成自己的東西的。那就原因可能就是前後filter問題

返回的頁面先到 ThymeleafViewResolver視圖解析器,然後再進入SiteMeshFilter,再到SiteMeshFilter的時候他會去以 “FORWARD” GET 的方式從請求的路徑找對應的裝飾器頁面,然後去獲取,之後把兩個響應的頁面根據標籤整合,需要注意的是FORWARD去請求裝飾頁面的時候沒有進入ThymeleafViewResolver解析,也就是如果裝飾頁面如果有thymeleaf標籤的話就會解析不了,知道原理,解決方法也就好找到了,沒錯就是自定義個Filter這個Filter的

@Configuration
@ComponentScan(basePackages = {"cn.hutool.extra.spring"})
public class WebConfig implements WebMvcConfigurer {

    /**
     * siteMeshFilter配置
     * @return
     */
    @Bean
    public FilterRegistrationBean siteMeshFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        WebSiteMeshFilter webSiteMeshFilter = new WebSiteMeshFilter();
        filterRegistrationBean.setFilter(webSiteMeshFilter);
        return filterRegistrationBean;
    }
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        MyFilter myFilter = new MyFilter();
        filterRegistrationBean.setFilter(myFilter);
        //攔截FORWARD請求  2.1.13只支持Quest  AbstractFilterRegistrationBean#configure   寫這個的目的是攔截sitemesh的FORWARD 請求獲取佈局文件
        filterRegistrationBean.setDispatcherTypes(DispatcherType.FORWARD);
        return filterRegistrationBean;
    }

}

myFilter是我自定義的Filter,需要注意的是註冊Filter的時候需要設置setDispatcherTypes爲DispatcherType.FORWARD枚舉類型

如果不加的話默認應該REQUEST,這樣的話就不會攔截到sitemesh內部的轉發請求了,這裏還應該設置下

filterRegistrationBean.addUrlPatterns("*.html");

也就是隻攔截html後綴的,這樣的話就可以完美解析了,其他視圖解析框架整合sitemesh類似,不在此贅述。

如果再整合shiro呢,裝飾頁面有Shiro標籤,執行的時候也會報錯,怎麼辦呢,下一篇來說

No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章