• spring boot拦截器WebMvcConfigurerAdapter,以及高版本的替换方案


     Springboot中静态资源和拦截器处理(踩了坑)

     

    背景: 在项目中我使用了自定义的Filter 这时候过滤了很多路径,当然对静态资源我是直接放过去的,但是,还是出现了静态资源没办法访问到springboot默认的文件夹中得文件

    springBoot2.0 访问磁盘图片实现方式

     1 @Configuration
     2 public class MyWebConfig implements WebMvcConfigurer {
     3 
     4     @Override
     5     public void addViewControllers(ViewControllerRegistry registry) {
     6         registry.addViewController("/").setViewName("app/index");
     7     }
     8 
     9     @Override
    10     public void addResourceHandlers(ResourceHandlerRegistry registry) {
    11         registry.addResourceHandler("/temp/**").addResourceLocations("file:d:/temp/");
    12     }
    13 }

    说下默认映射的文件夹有:

    classpath:/META-INF/resources

    • classpath:/resources

    • classpath:/static

    • classpath:/public

    上面这几个都是静态资源的映射路径,优先级顺序为:META-INF/resources > resources > static > public

    我们可以通过修改spring.mvc.static-path-pattern来修改默认的映射**

    *************************接管Spring Boot的Web配置 ************************这是重点中得重点********************

    如果Spring Boot提供的Sping MVC不符合要求,则可以通过一个配置类(注解有@Configuration的类)加上@EnableWebMvc注解来实现完全自己控制的MVC配置。

    当然,通常情况下,Spring Boot的自动配置是符合我们大多数需求的。在你既需要保留Spring Boot提供的便利,有需要增加自己的额外的配置的时候,可以定义一个配置类并继承WebMvcConfigurerAdapter,无需使用@EnableWebMvc注解。

    这里我们提到这个WebMvcConfigurerAdapter这个类,重写这个类中的方法可以让我们增加额外的配置

    自定义资源映射addResourceHandlers

    比如,我们想自定义静态资源映射目录的话,只需重写addResourceHandlers方法即可。

    通过addResourceHandler添加映射路径,然后通过addResourceLocations来指定路径。我们访问自定义my文件夹中

    复制代码
    @Configuration
    public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
        /**
         * 配置静态访问资源
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
            super.addResourceHandlers(registry);
        }
    }
    复制代码

    如果你想指定外部的目录也很简单,直接addResourceLocations指定即可,代码如下:

     public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/");
            super.addResourceHandlers(registry);
        }

    addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径

    页面跳转addViewControllers

    以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

    复制代码
    /**
         * 以前要访问一个页面需要先创建个Controller控制类,再写方法跳转到页面
         * 在这里配置后就不需要那么麻烦了,直接访问http://localhost:8080/toLogin就跳转到login.jsp页面了
         * @param registry
         */
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/toLogin").setViewName("login");
            super.addViewControllers(registry);
        }
    复制代码

    拦截器在我们项目中经常使用的,这里就来介绍下最简单的判断是否登录的使用。
    要实现拦截器功能需要完成以下2个步骤:

    • 创建我们自己的拦截器类并实现 HandlerInterceptor 接口
    • 其实重写WebMvcConfigurerAdapter中的addInterceptors方法把自定义的拦截器类添加进来即可

    首先,自定义拦截器代码:

    复制代码
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            boolean flag =true;
            User user=(User)request.getSession().getAttribute("user");
            if(null==user){
                response.sendRedirect("toLogin");
                flag = false;
            }else{
                flag = true;
            }
            return flag;
        }
    
        @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 {
        }
    }
    复制代码

    这里我们简单实现了根据session中是否有User对象来判断是否登录,为空就跳转到登录页,不为空就通过。

    接着,重写WebMvcConfigurerAdapter中的addInterceptors方法如下:

    复制代码
    /**
    * 拦截器
    * @param registry
    */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns 用于添加拦截规则
        // excludePathPatterns 用户排除拦截
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/toLogin","/login");
        super.addInterceptors(registry);
    }
    复制代码

    addPathPatterns("/**")对所有请求都拦截,但是排除了/toLogin/login请求的拦截

    
    
  • 相关阅读:
    右滑返回上一页
    flutter 启动图
    [题解]NOIP2014
    [题解]LightOJ1289 LCM from 1 to n
    [题解]CodeForces442B Andrey and Problem
    [题解]HDU4035 Maze
    [题解]CodeForces#290(div1)
    SCP-bzoj-1078
    SCP-bzoj-1068
    SCP-bzoj-1054
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/9482597.html
Copyright © 2020-2023  润新知