我需要像<mvc:resources mapping="/id1/resources/**" location="/id1/resources/static" />
,<mvc:resources mapping="/id2/resources/**" location="/id2/resources/static" />
這樣的資源映射爲每個產品(每個產品都可以有自己的靜態css,javascript ...)。由於產品將在運行時創建,因此我不能簡單地對每個資源映射聲明進行硬編碼。所以我能想到的方法是使用AOP爲每個資源請求重寫資源位置。ResourceHttpRequestHandler上的Spring AOP
首先,我得看點類
public class ResAudience {
public void anyMethodBefore() {
System.out.println("any method before ...");
}
public void anyMethodAfter() {
System.out.println("any method return ...");
}
}
我發現資源請求被org.springframework.web.servlet.resource.ResourceHttpRequestHandler處理。所以AOP配置
<aop:config>
<aop:aspect ref="resAspect">
<aop:pointcut id="resHandler" expression="execution(* org.springframework.web.servlet.resource.ResourceHttpRequestHandler..*(..))" />
<aop:before pointcut-ref="resHandler" method="anyMethodBefore"/>
<aop:after pointcut-ref="resHandler" method="anyMethodAfter"/>
</aop:aspect>
</aop:config>
我holping基於該請求,如ResourceHttpRequestHandler#setLocations(List locations)通過AOP重新編寫的位置,但被調用的唯一功能在應用程序生命週期是ResourceHttpRequestHandler#handleRequest(HttpServletRequest request, HttpServletResponse response),我好像在那裏不有機會重新寫入位置。
我相信肯定會有一些我想念的東西。有人會幫助找到在運行期間重寫該位置的方式(不需要使用AOP)嗎?提前致謝。