springboot 入门八-自定义配置信息(编码、拦截器、静态资源等)

若想实际自定义相关配置,只需要继承WebMvcConfigurerAdapter。WebMvcConfigurerAdapter定义些空方法用来重写项目需要用到的WebMvcConfigure实现。具体写法如下:

@Configuration
public class BootConfig  extends WebMvcConfigurerAdapter

@Configuration表示这是Java配置类;

一、编码配置

在springmvc中使用在web.xml添加过滤器。

<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

在springboot中只需要要配置类中注入过滤器

@Bean
    public Filter characterEncodingFilter() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return characterEncodingFilter;
    }

二、拦截器interceptor

Interceptor是链式调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。每个Interceptor 的调用会依据它的声明顺序依次执行。自定义拦截器需要实现HandlerInterceptor接口,重写三个方法preHandle、postHandle、afterCompletion。

preHandle():  在业务处理器处理请求之前被调用。可以在这个方法中进行一些判断来决定请求是否要继续进行下去,返回boolean类型,返回false,表示请求结束,后续的Interceptor 和Controller都不会再执行

postHandle():  在当前请求进行处理之后。

afterCompletion():  是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。即完成整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

如:

public class BootInterceptor implements HandlerInterceptor {
    @Autowired
    private MemberService memberService;

........
}

如果拦截器中使用到其它类的调用,必需要对拦截器加入spring bean容器中管理。加入bean容器,需要使用@Bean注解,@Bean表示一种方法,产生一个bean的方法,并且交给Spring容器管理。

在自定义配置类中的写法:

     @Bean
    public BootInterceptor bootInterceptor() {
        return new BootInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(bootInterceptor())
        .addPathPatterns("/**")
        .excludePathPatterns("/login");
        super.addInterceptors(registry);
    }

三、定义方法跳转

在部分业务中,会出现跳转但又没任何具体的业务内容。

1、定义个controller方法处理跳转

2、springMVC中在xml配置文件中加入

<mvc:view-controller path="/vc" view-name="index"/>    
<mvc:view-controller path="/vcr" view-name="redirect:index"/>
<mvc:redirect-view-controller redirect-url="index" path="/rvc"/>

3、springboot在定制的配置类中,重写addViewControllers即可

@Override  
    public void addViewControllers(ViewControllerRegistry registry){  
        registry.addViewController("/login").setViewName("login");  
    }

四、静态资源

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/h/**").addResourceLocations("classpath:/html/");
    }

此配置比拦截器优先级要高,不需要经过拦截器。

五、CORS 跨域请求支持

跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,它允许您以灵活的方式指定哪些跨域请求被授权,而不是使用诸如IFRAME或JSONP之类的安全性较弱的方法。可以配置全局的规则,也可以使用@CrossOrigin注解进行细粒度的配置。

CORS与JSONP相比
1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS

@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").maxAge(3000).allowCredentials(false);
    }

原文地址:https://www.cnblogs.com/song27/p/7542803.html