springboot的WebMvcConfigurer和HandlerInterceptor

1、WebMvcConfigurer
①创建一个类实现此接口
在这里插入图片描述
1、拦截器的设置
/拦截器设置/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(webInterceptor)
.addPathPatterns("/")
.excludePathPatterns("/res/
");
}
第一种情况,将不拦截的方法写到此类里面

    			.excludePathPatterns("/res/**")
                .excludePathPatterns("/main/**")
                .excludePathPatterns("/teaching/**")
                .excludePathPatterns("/perpa/**")
                .excludePathPatterns("/group/**")
                .excludePathPatterns("/check/**")
                .excludePathPatterns("/teacherInfo/**")
                .excludePathPatterns("/jibeidesgin/**");

第二种情况,将拦截的方法写到拦截器里面(webInterceptor)

@Component
public class WebInterceptor implements HandlerInterceptor {

    private final Logger logger = LoggerFactory.getLogger(WebInterceptor.class);

    private List<String> excludedUrlList = new ArrayList<>();

    public WebInterceptor() {
        excludedUrlList.add("/personal/main/main");
        excludedUrlList.add("/main/main");
        excludedUrlList.add("/personal/main/toGetAllComment.action");
        excludedUrlList.add("/personal/teacherInfo/");
        excludedUrlList.add("/personal/archivesLevel/");
        excludedUrlList.add("/personal/login/checkAccess");
        excludedUrlList.add("/personal/login/loginIn");
        excludedUrlList.add("/login/checkAccess");
        excludedUrlList.add("/login/loginIn");
        excludedUrlList.add("/personal/docking/personnelManagement");
        excludedUrlList.add("/personal/docking/personnelManagement");
        excludedUrlList.add("/personal/docking/loginPm");

    }

注:registry.addInterceptor(webInterceptor)是添加一个拦截器,webInterceptor为一个拦截器,在上方通过注解注入

@Autowired
private WebInterceptor webInterceptor;

.addPathPatterns("/") 为拦截的请求, .excludePathPatterns("/res/"),为不进行拦截的请求

**2**、页面跳转设置 addViewControllers****

/设置跳转界面设置/
@Override
public void addViewControllers(ViewControllerRegistry registry) {

    /*转发*/
   // registry.addViewController("/").setViewName("forward:/main/main");
    /*重定向*/
    /*可设置转发页面和重定向页面,一般用于登录界面跳转*/
    registry.addRedirectViewController("/","/main/main");
    /*设置优先级*/
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

3、资源拦截设置 addResourceHandlers
/资源拦截设置/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/addResoureHandler:指的是对外暴露的访问路径
addResourceLocations:指的是内部文件放置的目录
/
registry.addResourceHandler("/res/").addResourceLocations(“res/”);
}
4、跨域(当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时,一个资源会发起一个跨域HTTP请求(Cross-site HTTP request)。)
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/
")//设置允许跨域的路径
.allowedOrigins("*")//设置允许跨域请求的域名
.allowCredentials(true)//是否允许证书 不再默认开启
.allowedMethods(“GET”, “POST”, “PUT”, “DELETE”)//设置允许的方法
.maxAge(3600);//跨域允许时间
}
}

二、HandlerInterceptor接口详解
①preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;

②postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView (这个博主就基本不怎么用了);
③afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);

一、重学springboot拦截器与过滤器
1、过滤器(Filter)
①实现方式(javax.servlet.Filter)
通过实现Filter接口,重写其中的方法(init初始化,doFilter容器存在时,destroy容器销毁)

public class LogCostFilter implements Filter {

  //servlet容器初始化时
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    }

  //servlet容器存在时
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Execute cost="+(System.currentTimeMillis()-start));
    }

  //servlet容器销毁时
    @Override
    public void destroy() {

    }
}

2、拦截器(Interceptor)
①实现方式:实现HandlerInterceptor 接口的拦截器类

public class LogcostInterceptor implements HandlerInterceptor {
    long start = System.currentTimeMillis();
    //preHandle是在请求执行前执行的
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        start = System.currentTimeMillis();
        return true;
        //返回true,postHandler和afterCompletion方法才能执行
        // 否则false为拒绝执行,起到拦截器控制作用
    }

    //postHandler是在请求结束之后,视图渲染之前执行的,但只有preHandle方法返回true的时候才会执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("Interception cost="+(System.currentTimeMillis()-start));
    }

    //afterCompletion是视图渲染完成之后才执行,同样需要preHandle返回true,
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        //该方法通常用于清理资源等工作
    }
}

②需要配置视图(需继承里面的方法WebMvcConfigurationSupport )
一、
/addResoureHandler:指的是对外暴露的访问路径
addResourceLocations:指的是内部文件放置的目录/
/**
* 静态资源配置
/
/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/res/**") 对外暴露的访问路径
.addResourceLocations(“res/”); 内部文件的放置位
}*/
二、跨域配置

    /*跨域的配置*/
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        /**/
        registry.addMapping("/**")/*设置允许跨域的路径*/
                .allowedOrigins("*")/*设置允许跨域的域名*/
                .allowCredentials(true)/*设置允许的证书*/
                .allowedMethods("GET","POST","DELETE","PUT")/*设置允许跨域的方法*/
                .maxAge(7200);/*设置跨域的最大时间*/
    }

三、路径的拦截的配置

 /*拦截路劲配置*/
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /*需要执行拦截的路径和放行的路径*/
        registry.addInterceptor(new WebInterceptor())/*拦截类*/.addPathPatterns("/**")/*拦截的路径*/.excludePathPatterns("/main/**");/*放行的路径*/
    }

这边拦截路径有两种写法
①将需要放行的路径全部写在.excludePathPatterns("")里面

    @Override
    public void addInterceptors(InterceptorRegistry registry)
    {
        registry.addInterceptor(webInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/res/**")
                .excludePathPatterns("/main/**")
                .excludePathPatterns("/teaching/**")
                .excludePathPatterns("/perpa/**")
                .excludePathPatterns("/group/**")
                .excludePathPatterns("/check/**")
                .excludePathPatterns("/teacherInfo/**")
                .excludePathPatterns("/jibeidesgin/**");
    }

②将需要放行的路径写在拦截器类中
使用拦截器类的空参构造器


    /*定义一个存放拦截器放行路径的集合*/
    private List<String> interceptorList = new ArrayList<>();
    public WebInterceptor(){
        /*将需要放行的路径存放到此集合中*/
        interceptorList.add("/main/main");
    }

这时,需要修改拦截器视图里面的内容

/*注入拦截器类*/
    @Autowired
    private WebInterceptor webInterceptor;


   /*拦截路劲配置*/
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /*需要执行拦截的路径和放行的路径*/
        registry.addInterceptor(webInterceptor)/*拦截类*/.addPathPatterns("/**")/*拦截的路径*/.excludePathPatterns("/main/**");/*放行的路径*/
    }

此时,拦截器就算是配置完成


版权声明:本文为qq_36157687原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。