今天介绍下springmvc学习中的拦截器,常用我们在访问项目的时候会拦截判断用户是否登录等,有点类似于我们在servlet中使用的filter过滤器
1.那么springmvc拦截器是在什么地方拦截的(执行规则)?
2.springmvc拦截器是怎么在项目中应用的?
我们定义一个拦截器的类,实现HandlerInterceptor接口:
接着我们在springmvc的配置文件中配置拦截
只有当拦截器的方法preHandle返回了true,才可以执行后面的两个方法
那么如果我们配置了多个拦截器,那么他的运行规则怎么样的,我们来配置多个拦截器测试
<!-- SPringmvc的拦截器 ,里面可以放多个拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截的路径-->
<mvc:mapping path="/**" />
<!-- 定义的拦截器类-->
<bean class="com.itheima.springmvc.interceptor.interceptor3"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 拦截的路径-->
<mvc:mapping path="/**" />
<!-- 定义的拦截器类-->
<bean class="com.itheima.springmvc.interceptor.interceptor4"/>
</mvc:interceptor>
</mvc:interceptors>
package com.itheima.springmvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class interceptor4 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
System.out.println("preHandle4方法是在controller方法的执行之前执行");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle4方法是方法的执行之后执行");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion4方法是方在jsp-->html页面渲染后再执行");
}}
我们来看下运行的结果
总结:
preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用
postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用
拦截器的运行规则大家知道了,那么我们来应用一下,后面用代码来解释
public class interceptor3 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
System.out.println("preHandle3方法是在controller方法的执行之前执行");
//判断用户的请求是否是在登录的页面,不是的话重定向到登录的页面
String requestURI = request.getRequestURI();
if(!requestURI.contains("/login")){
String username = (String) request.getSession().getAttribute("USER_SESSION");
if(null == username){
response.sendRedirect(request.getContextPath() + "/login.action");
return false;
}
}
//登录的话直接放行
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle3方法是方法的执行之后执行");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion3方法是方在jsp-->html页面渲染后再执行");
}
//去登陆的页面
@RequestMapping(value = "/login.action",method = RequestMethod.GET)
public String login(){
return "login";
}
@RequestMapping(value = "/login.action",method = RequestMethod.POST)
public String login(String username
,HttpSession httpSession){
//登录后将信息放在session中,转发到列表页面
httpSession.setAttribute("USER_SESSION", username);
return "redirect:/item/itemlist.action";
}