在每個request中,根據不同的情況,需要做一些AOP的操作。不知道雜實現,不曉得和以前寫的
aop的cache是否有類似之處呢。網上資料顯示針對controller和針對manager的aop應該是不同的,那麼就試試吧。
參考文章如下:
http://blog.arendsen.net/index.php/2006/10/31/using-spring-20-aop-to-implement-web-request-interception/
查找到,我們的springmvc裏面使用的是
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
來處理應用,一直看它的基類是用AbstractHandlerMapping在處理,我們就是利用的立面的interceptors
這個屬性。
撰寫ValidateHandlerInterceptor集成自HandlerInterceptor,核心代碼如下:
public class ValidateHandlerInterceptor implements HandlerInterceptor {
//頁面校驗的manager
private PageInstanceManager pageInstanceManager;
//日誌
private static Log log = LogFactory
.getLog(ValidateHandlerInterceptor.class);
//調用結束後,已經view render了之後的clean操作
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
log.debug("after render the view :" + new Date());
}
//方法調用時,在view render之前的調用
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView view)
throws Exception {
String validate_rule_flag = request.getParameter("validate_rule_flag");
log.debug("do I need to put in the validate rules: "
+ StringUtil.isNotBlank(validate_rule_flag));
if (StringUtil.isNotBlank(validate_rule_flag)) {
//這個是我應用中的特例,根據request過來的參數,判斷是否要加上頁面校驗的東東
addValidateRule(request, response, view);
}
log.debug("invoke method,but before render view : " + new Date());
}
//方法調用前調用
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
log.debug("before the handle invoke :" + new Date());
return true;
}
...
}
在我們的xml配置文件中,spring的配置文件做如下增加:
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="interceptors">
<list>
<bean class="cn.sccl.validate.web.ValidateHandlerInterceptor" />
</list>
</property>
</bean>
其中配置的cn.sccl.validate.web.ValidateHandlerInterceptor就是我們剛纔作爲HandlerInterceptor的類。這樣的話每個.do的request都會被我們
AOP的攔截處理,一些每個action都會考慮要添加的動作或者都需要判斷處理的動作就可以放在這裏,比filter使用得方便一些,可以得到前後request,response和
我們的spring controller的ModelAndView的各種信息。