10、SpringMVC之拦截器
过滤器与拦截器的异同
共同点:功能几乎一样,都可以拦截请求进行预处理,放行等作用
区别:
(1)Filter属于Servlet技术,也就是说如果项目是JavaWeb项目就可以直接使用Filter过滤器,而拦截器是springMVC框架提供的,只有使用SpringMVC的工程才能使用它;
(2)拦截的作用域不同,Filter配置为“/*”就会拦截所有的请求,而拦截器只会拦截范围控制器方法的请求,因此过滤器作用域比拦截器大;
执行顺序如下图:
第一步、编写拦截器
编写拦截器1实现HandlerInterceptor接口
/**
* 编写拦截器
*/
public class MyInterceptor1 implements HandlerInterceptor{
/**
* 预处理:controller方法执行前
* return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor执行了...");
return true;
}
/**
* 不放行的情况下,利用原生API将给错误转发到错误页面
* return false 不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
// @Override
// public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// System.out.println("MyInterceptor执行了...");
// request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
// return false;
// }
/**
* 后处理方法,controller方法执行后,success.jsp执行之前
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
// @Override
// public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// System.out.println("MyInterceptor执行了...后处理方法");
// }
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor执行了...后处理方法");
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
}
/**
* success.jsp页面执行后,该方法会执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor执行了...最后执行");
}
}
编写拦截器2(编写第二个拦截器是为了测试多个拦截器下的请求顺序)
/**
* 编写拦截器
*/
public class MyInterceptor2 implements HandlerInterceptor{
/**
* 预处理:controller方法执行前
* return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
* return false 不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor执行了...222");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor执行了...后处理方法222");
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
}
/**
* success.jsp页面执行后,该方法会执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor执行了...最后执行222");
}
}
第二步、配置拦截器
配置拦截器(在springmvc配置文件中配置)
<!--配置拦截器-->
<mvc:interceptors>
<!--配置拦截器-->
<mvc:interceptor>
<!--要拦截的具体方法-->
<mvc:mapping path="/user/*"/>
<!--不拦截的方法-->
<!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
<!--配置拦截器对象-->
<bean class="com.example.interceptor.MyInterceptor1"/>
</mvc:interceptor>
<!--配置第二个拦截器-->
<mvc:interceptor>
<!--要拦截的具体方法-->
<mvc:mapping path="/**"/>
<!--不拦截的方法-->
<!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
<!--配置拦截器对象-->
<bean class="com.example.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
请求
<a href="user/testInterceptor">拦截器</a>
控制器
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testInterceptor")
public String testInterceptor() {
System.out.println("testInterceptor执行了");
return "success";
}
}
响应页面
<html>
<head>
<title>success</title>
</head>
<body>
<% System.out.println("success.jsp执行了..."); %>
</body>
</html>