学习SpringMvc第一部分-第二天

69 阅读2分钟

拦截器

基本概念

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

实现接口:org.springframework.web.servlet.HandlerInterceptor

继承适配器org.springframework.web.servlet.handler.HandlerInterceptorAdapter

拦截器实现

实现HandlerInterceptor 接口

  • 接口实现类
public class MyInterceptor1 implements HandlerInterceptor{
    /**
     * preHandle 在请求方法拦截前执行
     * 返回true 代表对当前请求进行放行处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("handler方法之前执行MyInterceptor1-->preHandle方法...");
        return true;  //继续执行action
    }

    /**
     * 请求执行后,生成视图前执行
     */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("handler方法之后,生成视图之前执行MyInterceptor1-->postHandle方法...");  
    }

    /**
     * 在请求方法执行后进行拦截
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        
        System.out.println("handler方法执行完毕,生成视图后执行MyInterceptor1-->afterCompletion...");
    }
}
  • 生效拦截器xml配置
<!--配置方式一-->
<mvc:interceptors>
    <!-- 使用bean定义一个Interceptor
    直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
    <bean class="com.xxxx.springmvc.interceptors.MyInterceptor1" />
</mvc:interceptors>
<!--配置方式二-->
<mvc:interceptors>
    <!-- 定义在 mvc:interceptor 下面 拦截所有test地址开头的请求-->
    <mvc:interceptor>
        <mvc:mapping path="/test/*.do" />
        <bean class="com.xxxx.springmvc.interceptors.MyInterceptor1" />
    </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("handler方法之前执行MyInterceptor2-->preHandle方法...");
        return true;
    }
}
  • 生效拦截器xml配置
<!--配置方式二-->
<mvc:interceptors>
    <!-- 定义在 mvc:interceptor 下面 拦截所有test地址开头的请求-->
    <mvc:interceptor>
        <mvc:mapping path="/test/*.do" />
        <bean class="com.xxxx.springmvc.interceptors.MyInterceptor2" />
    </mvc:interceptor>
</mvc:interceptors>

多个拦截器实现

SpringMvc 框架支持多个拦截器配置,从而构成拦截器链,对客户端请求进行多次拦截操作。

  • 拦截器代码实现

这里参考MyInterceptor1、MyInterceptor2代码

  • 生效拦截器xml配置
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 拦截所有请求 -->
        <mvc:mapping path="/**" />
        <bean class="com.xxxx.springmvc.interceptors.MyInterceptor" />
    </mvc:interceptor>
    <mvc:interceptor>
        <!-- 拦截所有请求 -->
        <mvc:mapping path="/**" />
        <bean class="com.xxxx.springmvc.interceptors.MyInterceptor2" />
    </mvc:interceptor>
</mvc:interceptors>

拦截器应用-非法请求拦截处理

使用拦截器完成用户是否登录请求验证功能

用户控制器-UserController定义

/**
 * 
 * @author Administrator
 * 模拟 用户操作
 */
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/userLogin")
    public ModelAndView userLogin(HttpServletRequest request){
        ModelAndView mv=new ModelAndView();
        User user=new User();
        user.setUserName("admin");
        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;
    }
}

非法请求拦截器定义

public class LoginInterceptor extends HandlerInterceptorAdapter{

    /**
     * 方法拦截前执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        User user= (User) request.getSession().getAttribute("user");   
        /**
         * 判断session user 是否为空
         */
        if(null==user){
            response.sendRedirect(request.getContextPath()+"/login.jsp");
            return false;
        }
        return true; 
    }
}

拦截器生效配置

<!-- 拦截所有请求 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <!--放行用户登录请求-->
        <mvc:exclude-mapping path="/user/userLogin"/>
        <bean class="com.xxxx.springmvc.interceptors.LoginInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>