SpringMVC框架如何定义拦截器呢?

64 阅读2分钟

SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆等操作。

![](https://i0.hdslb.com/bfs/article/920ff1c6d4f322d497b250163b3235239ee19323.png)

SpringMVC 拦截器的定义方式

  • 实现接口

  • 继承适配器

案例实操

实现接口

实现 HandlerInterceptor 接口方式定义我们的拦截器代码如下:

public class MyInterceptor implements HandlerInterceptor{

/**

  • preHandle 在请求方法拦截前执行

  • 返回 true 代表对当前请求进行放行处理

*/

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

System.out.println("action 之前执行!!!");

return true; //继续执行 action

}

/**

  • 请求执行后,生成视图前执行

*/

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

System.out.println("Action 执行之后,生成视图之前执行!!");

}

/**

  • 在请求方法执行后进行拦截

*/

@Override

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

System.out.println("方法执行后进行拦截。。释放资源。。。");

}

}

对应配置有两种方式:

配置方式一(拦截所有请求配置方式):

mvc:interceptors

</mvc:interceptors>

配置方式二(拦截指定请求配置方式)

mvc:interceptors

mvc:interceptor

<mvc:mapping path="/test/*.do" />

</mvc:interceptor>

</mvc:interceptors>

效果:

请求地址: http://localhost:8080/springmvc03/test/hello.do

控制台打印结果信息:

![](https://i0.hdslb.com/bfs/article/a913c770173d613be40d16094f16ea5655a28335.png)

多个拦截器配置(多个拦截器组成一个拦截器链 ,栈式结构 123 321 退出):

mvc:interceptors

mvc:interceptor

<mvc:mapping path="/**" />

</mvc:interceptor>

mvc:interceptor

<mvc:mapping path="/**" />

</mvc:interceptor>

</mvc:interceptors>

继承适配器

继承 HandlerInterceptorAdapter 方式定义拦截器(实际上最终还是 HandlerInterceptor 接口实现)

public class MyInterceptor2 extends HandlerInterceptorAdapter{

/**

  • 重写 preHandle 请求执行前执行
    */

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

System.out.println("请求前执行。。。");

return true;

}

}

扩展

使用拦截器完成用户是否登录请求验证拦截器定义:

public class LoginInterceptor implements HandlerInterceptor{

/**

  • 方法拦截前执行

*/

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

User user= (User) request.getSession().getAttribute("user");

/**

  • 判断 uri 是否包含路径

  • 包含就放行

*/

if(request.getRequestURI().indexOf("userLogin.do")>-1){

return true;

}

/**

  • 判断 session user 是否为空

*/

if(null==user){

response.sendRedirect(request.getContextPath()+"/login.jsp");

return false;

}

return true; //继续执行 action

}

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

System.out.println("Action 执行之后,生成视图之前执行!!");

}

/**

  • 在方法执行后进行拦截

*/

@Override

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

System.out.println("方法执行后进行拦截。。释放资源。。。");

}

}

UserController 类

/**

*

* @author Administrator

* 模拟 用户操作

*/

@Controller

@RequestMapping("/user")

public class UserLoginController {

@RequestMapping("/userLogin")

public ModelAndView userLogin(HttpServletRequest request){

ModelAndView mv=new ModelAndView();

User user=new User();

user.setUserName("xxx");

user.setUserPwd("123456");

request.getSession().setAttribute("user", user);

mv.setViewName("success");

return mv;

}

@RequestMapping("/addUser")

public ModelAndView addUser(){

System.out.println("添加用户记录。。。");

ModelAndView mv=new ModelAndView();

mv.setViewName("success");

return mv;

}

@RequestMapping("/delUser")

public ModelAndView delUser(){

ModelAndView mv=new ModelAndView();

mv.setViewName("success");

return mv;

}

@RequestMapping("/updateUser")

public ModelAndView updateUser(){

ModelAndView mv=new ModelAndView();

mv.setViewName("success");

return mv;

}
}

拦截器 xml 配置

mvc:interceptors

mvc:interceptor

<mvc:mapping path="/**" />

</mvc:interceptor>

</mvc:interceptors>