17. 拦截器
1、拦截器接口:HandlerInterceptor
SpringMVC定义了拦截器接口HandlerInterceptor
该接口中定义了三个方法,这三个方法的调用时在SpringMVC框架内部完成的,调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。
2、三个方法
boolean preHandle
预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三个参数为被拦截的处理器方法。如果preHandle方法返回true表示继续流程(如调用下一个拦截器或处理器方法),返回false表示流程中断,不会继续调用其他的拦截器或处理器方法,此时我们需要通过response来产生响应;
void postHandle
后处理方法,实现处理器方法的后处理,就是在处理器方法调用完成,但在渲染视图之前,该方法被调用,此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理。
afterCompletion
整个请求处理完毕,即在视图渲染完毕时该方法被执行。
3、拦截器的实现
案例:检测是否登录,若没有登录或登录过期则跳转到登录页面。
3.1 编写拦截器类
package com.company.ssm.interceptor;
import com.company.ssm.bean.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
/*
方法:检测用户是否登录,若没有登录则跳转登录页
当请求到达控制器之前被执行
true--继续向下执行,到达下一个拦截器,或控制器
false--不会继续向下执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if(user != null){
response.sendRedirect(request.getContextPath()+"/loginCtl/toLogin");
return false;
}else{
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 {
}
}
3.2 注册拦截器
在springmvc.xml中添加
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/><!-- 配置哪些请求被拦截 拦截器不会拦截jsp页面请求-->
<mvc:exclude-mapping path="/statics/**"/><!-- 哪些请求不被拦截 -->
<mvc:exclude-mapping path="/loginCtl/toLogin"/><!-- 哪些请求不被拦截 -->
<bean id="demo" class="com.company.ssm.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>