美文网首页java学习之路
spring boot2 (五)web中静态资源访问配置和res

spring boot2 (五)web中静态资源访问配置和res

作者: 唯有努力不欺人丶 | 来源:发表于2021-01-12 23:02 被阅读0次

    说到web开发那简直能说的太多了,而且这个也是java很常见的实际工作场景。之前这一块也零零散散说了很多,这里重温一下其中的知识。

    静态资源访问路径

    说到静态资源访问,我第一印象居然是之前spring+spring mvc的时候,webapp下web-inf里的html页。。虽然这么说挺不准确的,但是我记得静态资源都是要放在webapp下的。但是现在的spring boot,都已经没有webapp了。所以spring boot中访问静态资源也简单的多,其有四个默认的读取地点:
    类路径下:/static (or /public or /resources or /META-INF/resources)
    下面是我测试的demo:


    四张图片的位置

    下面我启动项目,不做任何额外的配置直接ip+端口+图片名访问


    第一张图
    第二张图
    第三张图
    第四张图
    如上测试结果,事实证明这几个默认路径下的静态资源确实可以直接访问。

    不过其实这里有一个小问题大家可能没注意,就是假如有一个和静态资源一样名称的接口呢,回如何返回?下面我们实际测试一下:


    如图,下面我们访问一下看看会获取静态资源还是走到接口
    优先走了接口

    为什么会先走接口呢?是偶然还是必然?其实这个是必然的。因为这个请求解析原理:请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面
    所以说controller中的接口是优先于静态资源的。

    静态资源访问前缀

    首先默认的静态资源的访问是没有前缀的,就是从根路径访问的。
    但是实际项目中经常我们要把静态资源单独拎出来。毕竟打个比方,有些时候我们系统要做token拦截校验的,但是静态资源应该是不需要校验的,所以就不能和常规的一些方法放一起,应该是有一个单独的路径。所以我经常用ip:port/xxx/imgs/**来保存静态资源,这个/imgs这一层就是我给所有的静态资源单独拎出来的一个前缀。
    这个是怎么设置的呢?在配置文件中:

    spring:
       mvc:
          static-path-pattern: /imgs/**
    

    配置静态资源前缀:



    然后我们重启项目然后访问下试试:


    静态资源的前缀设置成功
    当然了,这个静态资源本身的位置也可以指定。毕竟虽然默认的四个用起来也比较乱,而且排他性不强(比如明明想用static下放静态资源路径,但是如果随便放在了public下也可以访问到,这个其实不是想要的)。
    下面是指定静态资源位置的配置:
    spring:
       resources:
          static-locations: classpath:/lsj   
    
    指定类路径下lsj为静态资源的位置

    下面我们类路径下创建lsj文件下并放个图片试试。


    只有在lsj文件夹下才能访问

    如上图,之前四个默认路径下的静态资源都访问不了了,只有配置文件中指定的lsj文件下的才可以。
    其实这个原因也简单的很,因为spring boot的默认值static-locations就是嘴上面说的四个位置。而当我们主动去指定了以后,读取的时候会去读我们指定的,从而默认的四个不生效了。
    当然了,还有一个好玩的配置:禁止访问项目中的静态资源,如下配置:

      resources:
        add-mappings: false   禁用所有静态资源规则
    

    这个配置很简单,但是为什么这么配可以说一下,我们去源码中找原因:


    源码

    注意这里有这么个判断:

    if (!this.resourceProperties.isAddMappings()) {
                    logger.debug("Default resource handling disabled");
                    return;
                }
    

    根据打印的话:默认资源处理已禁用。就知道这个是什么了。
    然后这个变量:this.resourceProperties.isAddMappings()是绑定配置文件中我们配置的变量的。所以才有了如上的结果。


    中间略过欢迎页等,毕竟我一直习惯前后端分离项目,所以不看这块了。


    说一个扩展的小知识:@Bean注释的方法有参数,那么其所有的参数的值都会从容器中确定。

    Restful接口风格

    其实restful接口风格我个人感觉就是用请求方式来判断接口作用。除了能少绞尽脑汁的想一些方法名称,暂时我还没get到特别实用的性能。。
    然后刚刚也说了,就是用请求方式的不同来走入不同的接口,比如/user
    同样的这个接口,

    • put提交就是添加用户
    • delete提交就是删除用户
    • get提交就是查找用户
    • post提交就是删除用户

    这四个接口都是一个接口路径/user,看上去优雅的很。
    然后这个都是spring boot默认支持的,就是在接口上指定方式,或者直接用@GetMapping(“/xxx”)或@PostMapping(“/xxx”)这样的注解就行了,但是有一点:
    表单提交是只有get/post的。
    那么如何实现这个delete/put呢?其实就是表单中指明提交方法后加一个name是_method的参数把想要称为的请求方式提交过来。
    然后虽然本质上还是post/get提交,但是可以用是spring boot一个现成的过滤器去读取这个_method并转成相应的方式。
    这个需要spring boot打开这个过滤配置,如下:

    spring:
      mvc:
        hiddenmethod:
          filter:
            enabled: true   #开启页面表单的Rest功能
    

    这里_method的值是spring boot默认指定了。如果想要改我们自己重写这个过滤器就可以了。

    因为web这块东西很多,我打算分开记录,所以本篇文章就到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利!另外如果我文中某些措辞不严谨或者表述不清楚欢迎指出!

    相关文章

      网友评论

        本文标题:spring boot2 (五)web中静态资源访问配置和res

        本文链接:https://www.haomeiwen.com/subject/xdhjaktx.html