1.撰写Interceptor
public class TestInterceptor extends HandlerInterceptorAdapter { private static Log log = LogFactory.getLog(TestInterceptor.class); /** * 顾名思义,该方法将在请求处理之前进行调用 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession sess = request.getSession(); sess.setAttribute("Name", "Donald_Draper"); ServletContext scon= request.getServletContext(); scon.setAttribute("loginPath", "/login"); log.info("============preHandle============"); return true; } /** * 由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion * 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。 * postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行, * 但是它会在DispatcherServlet 进行视图返回渲染之前被调用, * 所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。 */ public void postHandle(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse, Object obj, ModelAndView modelandview) throws Exception { log.info("============Name:"+httpservletrequest.getSession().getAttribute("Name")); } /** * 该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。 * 顾名思义,该方法将在整个请求结束之后, * 也就是在DispatcherServlet 渲染了对应的视图之后执行。 * 这个方法的主要作用是用于进行资源清理工作的。 */ public void afterCompletion(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse, Object obj, Exception exception) throws Exception { log.info("============loginPath:"+httpservletrequest.getServletContext().getAttribute("loginPath")); } }
2.配置拦截器
<!-- 访问拦截 -->
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/test/**"/> <bean class="com.controller.test.TestInterceptor"/> </mvc:interceptor> </mvc:interceptors>
3.启动web,访问host:8080/webName/test/charts,控制台输出:
com.fh.controller.test.TestInterceptor-2016-05-31 16:55:15 -19987 INFO - ============preHandle============
com.fh.controller.test.TestInterceptor-2016-05-31 16:55:15 -20030 INFO - ============Name:Donald_Draper
com.fh.controller.test.TestInterceptor-2016-05-31 16:55:15 -20281 INFO - ============loginPath:/login