spring boot中spring mvc使用拦截器

首先我们知道,spring boot帮我们约定好了大部分配置。我们无需再写配置文件,只需要进行极少的配置,就能跑起来一个web项目。

而我们配置 拦截器的时候 HandlerInterceptor   就不大可能使用xml来配置了,那就只能采用 config.java 配置类来配置、


首先我们先书写一个 拦截器

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("loginUser");
        if (user == null) {
            throw new InsufficientPermissions("未登录,权限不足!");
        } else {
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}


InsufficientPermissions 是我自定义异常


可以看见 就是实现了  HandlerInterceptor   接口而已。然后里面三个方法分别是 

     preHandler:在Controller执行之前调用
     postHandler:controller执行之后,且页面渲染之前调用
     afterCompletion:页面渲染之后调用,一般用于资源清理操作

 主要逻辑基本在 preHandler 进行;


下面来配置这个拦截器,其实思路就是 实现  WebMvcConfigurer 接口,然后再交给spring 管理,spring mvc呢,会自动的帮我们去处理这个配置类,并加载到内存中;

package com.nunbey.lotus.filter.MvcConfig;


import com.nunbey.lotus.filter.LoginHandlerInterceptor;
import com.nunbey.lotus.filter.ParameterVerification;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Component
public class WebSecurityConfig implements WebMvcConfigurer {

    @Override
    public  void addInterceptors(InterceptorRegistry registry){
        /*
        * 登录拦截 拦截后台未登录进行操作
        * */
        InterceptorRegistration addInterceptor1 = registry.addInterceptor(new LoginHandlerInterceptor());
        //排除配置  不拦截api  但是对于后台操作,需要拦截
        addInterceptor1.excludePathPatterns("/lotus/api/**");
        //拦截配置
        addInterceptor1.addPathPatterns("/**");
    }
}

@Component 是交给spring去管理的一个注解,一共有四个注解 


        @controller 控制器(注入服务)
       用于标注控制层,相当于struts中的action层

        @service 服务(注入dao)
        用于标注服务层,主要用来进行业务的逻辑处理

        @repository(实现dao访问)
        用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
.

        @component (把普通pojo实例化到spring容器中,相当于配置文件中的

         一般用于自己想将某个类注入spring



拦截器

可以知道 spring mvc底层代码只用了一个servlet,这样的好处能极大的提升性能和效率。但是与之而来的坏处,就是配置 过滤器不好控制。那么 spring mvc提供了,一个比较好控制,但是功能没有过滤器大。 这就是拦截器,拦截器只能拦截 controller ,而不能拦截servlet。但是 filter 拦截的是servlet,然而spring mvc又是只使用了一个servlet,所以他基本上算是全局拦截。下面这张图:

spring boot中spring mvc使用拦截器(图1)


当然,拦截器已经能满足我们几乎所有的需求。不过你还是能使用原生的 java web技术滴,就比如三大组件 servlet,filter,Listener