SpringBoot配置静态资源路径与拦截器

一、整合springmvc/访问静态资源

我们接着上一节的说,对于springboot我们应该也是有了相应的了解了,上节中说到修改tomcat端口号,我们可以先测试一下,在application.properties中添加如下配置

# tomcat端口
server.port=80

启动,看控制台就会发现端口号已被修改成80了,springboot项目在启动时,会默认寻找application.properties文件,里面的端口等各种配置,springboot都是有默认值的,如我们引入了想用的依赖,又没有对其进行配置,springboot会对自动进行默认的配置,这就是springboot如此受欢迎的原因之一。

好的,那么接下来我们想一下,springboot项目是打成jar包直接运行的,我们并没有在项目结构中发现webapp或者WebContentl目录,那我们的静态资源放在哪昵,我们用idea的快捷键:ctrl+shift+alt+N,搜索类ResourceProperties,打开,他是个class文件,位于spring-boot-autoconfigurejar包中,第一次打开这个编译后的class文件,idea会提示我们是否下载源码,点击下载。就可以打开java文件了。该类中对静态资源的默认查找路径进行了配置。

 

默认的静态资源路径为:

  • classpath:/META-INF/resources/

  • classpath:/resources/

  • classpath:/static/

  • classpath:/public

只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理。

一般我们会把静态资源放在classpath:/static/目录下。我们创建目录,并且添加一些静态资源: 

结构如下:

我们在静态资源路径下,放了一个1.png的图片,我们重启一下服务测试。

访问成功。

二、配置拦截器

拦截器是需要经常使用的,他不是一个普通属性,而是一个类,所以就要用到java配置方式了。

这里我们采用的方式是:实现WebMvcConfigurer接口并添加@Configuration注解来实现自定义部分SpringMvc配置。

我们先定义一个拦截器,新建包interceptor,用于放拦截器,定义拦截器如下:

package com.springboot.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class LoginInterceptor implements HandlerInterceptor {

    /**
     * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在
     * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
     * Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
     * 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle  method 执行了......!");
        return true;
    }

    /**
     * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之
     * 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操
     * 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像,
     * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor
     * 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle  method 执行了......!");
    }

    /**
     * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,
     * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion  method 执行了......!");
    }
}

方法作用看注释,拦截器定义好了,下一步就是定义配置类,注册拦截器:

在config下新建类InterceptorConfig,用于注册拦截器:

package com.springboot.config;

import com.springboot.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    /**
     * 通过@Bean注解,将我们定义的拦截器注册到Spring容器
     * @return
     */
    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }

    /**
     * 重写接口中的addInterceptors方法,添加自定义拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 通过registry来注册拦截器,通过addPathPatterns来添加拦截路径
        registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
    }
}

结构如下:

定义好了拦截器并注册到了spring,接下来我们测试一下,因为我们配置的拦截路径是所有请求,那我们重启项目之后随意访问一个路径,观察控制台:

注意打印顺序,与拦截器中的注释相对应理解。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值