Spring MVC中的拦截器(Interceptor )
类似于Servlet 中的过滤器(Filter) ,它主要用于拦截用户请求并做相应的处理。 例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用SpringMVC中的拦截器,就需要对拦截器类进行定义和配置。 通常拦截器类可以通过两种方式来定义。 一种是通过实现Handlerlnterceptor
接口,或继承Handlerlnterceptor
接口的实现类来定义;另一种是通过实现WebRequestlnterceptor
接口,或继承WebRequestlnterceptor
接口的实现类来定义。这里我以HandleInterceptor
为例:
/**
* 登录拦截器
* @author CHRISTMASY
*
*/
public class LoginInterceptor implements HandlerInterceptor{
//实现Handlerlnterceptor接口
//afterCompletion:在整个请求完成,即视图渲染结束之后执行
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception arg3)
throws Exception {
}
//postHandle:在控制器方法调用之后,且解析视图之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2, ModelAndView arg3) throws Exception {
}
// preHandler:在控制器方法前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
return false;
}
}
LoginInterceptor类实现了Handlerlnterceptor接口,以下是Handlerlnterceptor接口中的三个方法:
-
preHandler()
方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。 当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。 -
postHandle()
方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。 -
afterCompletion
()方法: 该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
要使我们自定义的拦截器生效,还需要在spring核心配置文件中配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**"/>
<!-- 定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截的 -->
<bean class="com.itheima.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
接下来我们验证拦截器是否生效,在LoginInterceptor拦截器的preHandle()
方法中编写判断语句来对访问者的用户进行区分
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
String url = request.getRequestURI();//获取请求路径
if(url.indexOf("/login")>=0){
return true;//return true 则进入下一个流程
}
HttpSession session = request.getSession();
User user = (User) session.getAttribute("USER_SESSION");
//通过session判断用户是否登录
if(user!=null){
return true;
}
request.setAttribute("msg", "您还没有登录,请先登录!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;//未登录则重定向到login页面,并return false
}
在浏览器中直接访问mian页面时,拦截器在preHandle()方法中识别到请求路径中不包含login,那么就对其进行判断,当session中没有用户信息时,则重定向到login页面,并且返回true,不执行后面的操作流程。