1.拦截器(Interceptor):它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
这是在springmvc中配置的拦截器
<mvc:interceptors>
<!--这是按照先后顺序-->
<mvc:interceptor>
<!--通配符配置-->
<mvc:mapping path="/user/**"/>
<!--这是针对通配符使用的,如果通配符中有个别不需要拦截的话就写上-->
<mvc:exclude-mapping path="/user/login"></mvc:exclude-mapping>
<mvc:exclude-mapping path="/user/doLogin"></mvc:exclude-mapping>
<bean class="com.imooc.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
这是配置的拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String username = (String) httpServletRequest.getSession().getAttribute("user");
if (username == null){
httpServletResponse.sendRedirect("/user/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("------postHandle------");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("------afterCompletion------");
}
}
这是UserController
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/list")
public String list(){
return "list";
}
@RequestMapping("/login")
public String login(){
return "login";
}
@RequestMapping("/doLogin")
public String doLogin(@RequestParam("username") String username,
HttpSession session){
session.setAttribute("user",username);
if (username.equals("admin")){
return "redirect:/user/list";
}
return "redirect:/user/login";
}
}
首先我们通过访问地址/user/login和/user/doLogin不会被拦截,输入localhost:8080/user/login会跳转到登录页面,点击登陆之后验证登录用户名,然后在doLogin里面把用户名放到session里面,如果验证成功会进入主页,这是我们就要经过拦截器,首先进入preHandle验证session是否登陆,如果登陆就返回true进入下一步,进到处理器适配器,然后处理Handle,返回ModelAndView,再进行视图解析,在DispatcherServlet返回视图之前进入PostInterceptor,返回页面视图之后进入afterCompletion。
下图是一个拦截器的时候
如果配置两个拦截器的话,会看配置的先后顺序