上述三個東西就不簡介了,直接說遇到的問題:
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.