开发者社区> 问答> 正文

spring能做到对静态资源访问的控制吗??报错

能做到的话,又该如何做呢?

目前用的springboot,使用

ResourceHandlers

映射的资源,发现根本不会进入

Interceptors

,即使不做资源映射,请求也不会进入拦截器...直接报错了:

No mapping found for HTTP request with URI 
[/resources/test/public/img/5b3e8ed6679f783e921455497f92a91b9de0df61.JPG]
 in DispatcherServlet with name 'dispatcherServlet'

难道拦截器只能拦截对控制器的请求?那些无效的请求直接 No mapping found ?

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new ResouceInteceptor()).addPathPatterns("/resources/**");
    super.addInterceptors(registry);
}

----------------------------------------------------------------------------

我该如何实现对静态资源的访问控制呢?

最起码能做到访问

/resources/test/public/img/5b3e8ed6679f783e921455497f92a91b9de0df61.JPG

时,我能用代码做相应的处理?

展开
收起
爱吃鱼的程序员 2020-06-07 22:42:51 943 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你是想要静态资源的权限控制?

    @Anur回复 @Anur:shiro是啊...

    springboot和spring毕竟不一样,SpringBoot自己配置了很多信息比如:

    自动配置的静态资源:在自动配置类的addResourceHandlers方法中定义了一下静态资源的自动配置

        类路径文件:把类路径下的/static、/public、/resources和/META-INF/resources文件夹下的静态文件直接映射为/**,可以通过http://localhost:8080/**来访问。

        ②webjar:webjar就是将我们常用的脚本框架封装在jar包中的jar包。把webjar的/META-INF/resources/webjars/下的静态资源文件映射为/webjars/**,可以通过http://localhost:8080/webjars/**来访问。

        自动配置的Formatter和Converter。我们可以看一下WebMvcAutoConfiguration类中的定义addFormatters(FormatterRegistry)方法。从代码中可以看出,只要我们定义了Converter、GenericConverter和Formatter接口的实现类的Bean,这些Bean就会自动注册到SpringMVC中。

        ④自动配置的HttpMessageConverter:在WebMvcAutoConfiguration中,我们注册了messageConverters,在configureMessageConverters方法,在这里直接注入了HttpMessageConverter的Bean,而这个Bean是在HttpMessageConverterAutoConfiguration类中定义的,我们自动注册的HttpMessageConverter除了SpringMVC默认的ByteArrayMessageConverter、StringHttpMessageConverter、SourceHttpMessageConverter、ResourceHttpMessageConverter、

    AllEncompassingFormHttpMessageConverter外,在我们的HttpMessageConverterAutoConfiguration的自动配置文件里还引入了JacksonHttpMessageConverter Configuration和GsonHttpMessageConverter Configuration,使得我们获得了额外的HttpMessageConverter。

            若jackson的jar包在类路径上,则SpringBoot通过JacksonHttpMessageConverters Configuration增加MappingJackson2HttpMessage Converter和MappingJackson2XmlHttpMessage Converter。

            若gason的jar包在类路径上,则SpringBoot通过GsonHttpMessageConverter Configuration增加GsonHttpMessage。

        ⑤静态首页的支持:把静态index.html文件放置在如下目录:

            classpath:META-INF/resources/index.html

            classpath:/resources/index.html

            classpath:/static/index.html

            classpath:/publik/index.html

    当我们访问应用根目录http://localhost:8080/时,会直接映射。

     

     

    自然了如果你想自己增加也是可以的,类似下面的写法就行,自己再改改吧,SpringBoot其实默认有上面的那些了

    程序的静态文件(js、css、图片)等需要直接访问,这时我们需要在配置里重写addResourceHandlers方法来实现。
    @Configuration
    @EnableWebMvc//1会开启一些默认配置,比如ViewResolver或者MessageConverter等,开启SpringMVC支持,没有这个注释,重写WebMvcConfigurerAdapter无效
    @EnableScheduling//开始计划任务的支持
    @ComponentScan("com.wisely.highlight_springmvc4")
    publicclassMyMvcConfigextendsWebMvcConfigurerAdapter{//2重写其方法可以对SpringMVC进行配置
       @Bean
       publicInternalResourceViewResolverviewResolver(){
          InternalResourceViewResolverviewResolver=newInternalResourceViewResolver();
          viewResolver.setPrefix("/WEB-INF/classes/views/");
          viewResolver.setSuffix(".jsp");
          viewResolver.setViewClass(JstlView.class);
          returnviewResolver;
       }
       /**
       *程序的静态文件需要直接访问,重写该方法即可
       */
       @Override
       publicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){
          //addResourceLocations指的是文件放置的目录,addResourceHandler指的是对外暴露的访问路径
          registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");//3
       }
       @Bean
       //1配置拦截器的Bean
       publicDemoInterceptordemoInterceptor(){
          returnnewDemoInterceptor();
       }
       @Override
       publicvoidaddInterceptors(InterceptorRegistryregistry){//2重写addInterceptors方法,注册拦截器
          registry.addInterceptor(demoInterceptor());
       }
       /**
       *快捷的ViewController,适用于无任何业务处理,只是简单的页面跳转
       */
       @Override
       publicvoidaddViewControllers(ViewControllerRegistryregistry){
          registry.addViewController("/index").setViewName("/index");//快捷的ViewController
          registry.addViewController("/toUpload").setViewName("/upload");
          registry.addViewController("/converter").setViewName("/converter");
          registry.addViewController("/sse").setViewName("/sse");
          registry.addViewController("/async").setViewName("/async");
       }
       /**
       *路径匹配参数设置
       *在SpringMVC中,路径参数如果带"."的话,"."后面的值将会忽略,重写此方法可以不忽略"."后面的参数
       */
       @Override
       publicvoidconfigurePathMatch(PathMatchConfigurerconfigurer){
          configurer.setUseSuffixPatternMatch(false);
       }
       /**
       *文件上传的配置
       */
       @Bean
       publicMultipartResolvermultipartResolver(){
          CommonsMultipartResolvermultipartResolver=newCommonsMultipartResolver();
          multipartResolver.setMaxUploadSize(1000000);
          returnmultipartResolver;
       }
       /**
       *配置自定义的HttpMessageConverter的Bean,在SpringMVC里注册HttpMessageConverter有两个方法
       *①configureMessageConverters:重载会覆盖掉SpringMVC默认注册的多个HttpMessageConverter
       *②extendMessageConverters:仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter
       */
       @Override
       publicvoidextendMessageConverters(List<HttpMessageConverter<?>>converters){
          converters.add(converter());
       }
       @Bean
       publicMyMessageConverterconverter(){
          returnnewMyMessageConverter();
       }
    }

     

    继承,重写方法我感觉可行

    2020-06-07 22:43:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多