下面我来详细讲解“SpringMVC中的拦截器详解及代码示例”的完整攻略。
1. 什么是SpringMVC拦截器
在SpringMVC中,每个请求都由HandlerMapping将请求路由到Controller方法,中间可能会经过多个拦截器。拦截器可以对请求进行预处理和后处理。预处理包括权限判断、实例化一些参数对象等操作,后处理包括修改返回值、输出日志等操作。拦截器类似于Servlet中的过滤器(Filter),但比过滤器功能更加强大。可以在拦截器中访问Spring容器中的Bean,这意味着可以在拦截器中做完复杂的处理后,将处理结果注入到Controller中。
2. SpringMVC拦截器的使用方式
SpringMVC拦截器的使用非常简单,只需要编写一个类实现HandlerInterceptor接口,并重写需要用到的方法即可。主要方法如下:
- preHandle:在请求处理之前进行调用(Controller方法调用之前);
- postHandle:在请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后);
- afterCompletion:在整个请求处理完毕之后被调用,DispatcherServlet 渲染视图后执行。
构建拦截器类的过程如下:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// do something before request handled by Controller
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// do something after Controller called but before returning view
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// do something after processing request and rendering view by SpringMVC
}
}
完成拦截器之后,在SpringMVC配置文件中定义拦截器并指定拦截的url路径即可。
3. SpringMVC拦截器的示例
3.1 计算Controller方法的执行时间
可以使用拦截器计算Controller方法的执行时间,然后将时间添加到日志中。拦截器代码如下:
public class LogInterceptor implements HandlerInterceptor {
private static final Log logger = LogFactory.getLog(LogInterceptor.class);
private static final String PASS_TIME = "passTime";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 记录当前时间
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 获取开始执行的时间
long startTime = (long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long passTime = endTime - startTime;
logger.info("request url: " + request.getRequestURI() + ", execute time: " + passTime + "ms");
}
}
在SpringMVC配置文件中配置拦截器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.example.LogInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3.2. 登录态拦截器
拦截未登录用户请求,使其必须先进行登录操作后才能访问其他请求。拦截器代码如下:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if (loginUser == null) {
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
在SpringMVC配置文件中配置拦截器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/info/**"/>
<bean class="com.example.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
/info/**
表示拦截/info
及其子路径下的请求。
以上就是关于“SpringMVC中的拦截器详解及代码示例”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC中的拦截器详解及代码示例 - Python技术站