Spring MVC拦截器

2018-06-13  本文已影响62人  Hey_Shaw

Spring MVC的静态概念

Spring MVC的动态概念

什么是拦截器

拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。

使用场景:解决请求的共性问题(如:乱码问题、权限验证问题等)

拦截器实现:

1、编写拦截器类实现HandlerInterceptor接口

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class IndexController {
    @RequestMapping("/viewAll")
    public ModelAndView viewAll(String name, String pwd) {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("/hello.jsp");
    mv.addObject("msg","从viewAll方法传回视图的数据!")
        return mv;
    }
}
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class TestInterceptor implements HandlerInterceptor {

  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      System.out.println("执行到了afterCompletion方法!");
  }

  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
    // 可以通过ModelAndView参数来改变显示的视图,或修改发往视图的方法
    modelAndView.addObject("msg","这里传回的是被拦截器修改之后的消息!");
    modelAndView.setViewName("/hello2.jsp");
    System.out.println("执行到了postHandle方法!");
  }

  // 返回值:表示我们是否需要将当前的请求拦截下来
  // 如果返回false:请求将被终止;true:请求会被继续运行
  // Object handler:被拦截的请求的目标对象,及IndexController的实例对象
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.setCharacterEncoding("UTF-8");  // 和过滤器解决乱码效果一样
        System.out.println("执行到了preHandle方法!");
        // 对用户是否登录进行判断
        if(request.getSession().getAttribute("user") == null){
        // 如果用户没有登录,就终止请求,并发送到登录页面
        request.getRequestDispatcher("/login.jsp").forward(arg0,arg1);
        return false ;
      }

      return true;
  }
}

2、将拦截器注册进SpringMVC框架中(spring-mvc.xml)

3、配置拦截器的拦截规则

<mvc:interceptors>
  <bean class="tk.liaohongdong.interceptor.TestInterceptor"></bean> <!--拦截所有请求-->
</mvc:interceptors>
<mvc:interceptors>
  <mvc:interceptor>
  <mvc:mapping path="/viewAll.form" /> <!-- 支持正则表达式 -->
      <bean class="tk.liaohongdong.interceptor.TestInterceptor"></bean> <!--拦截直到请求路径-->
  </mvc:interceptor>
</mvc:interceptors>
多个拦截器协同时工作流程图
多个拦截器协同时工作流程图
拦截器的其他实现方式
public class TestInterceptor2 implements WebRequestInterceptor {

    public void afterCompletion(WebRequest arg0, Exception ex) throws Exception {
        System.out.println("执行到了afterCompletion方法!");
    }

    public void postHandle(WebRequest arg0, ModelAndView modelAndView) throws Exception {
        System.out.println("执行到了postHandle方法!");
    }

    public void preHandle(WebRequest arg0) throws Exception {
        System.out.println("执行到了preHandle方法!");
    }

}
拦截器的使用场景

使用原则:处理所有请求的共同问题
1、解决乱码问题
2、解决权限验证问题

拦截器与过滤器的区别
上一篇 下一篇

猜你喜欢

热点阅读