当前位置:首页 » 《休闲阅读》 » 正文

MVC配置类之WebMvcConfigurationSupport

12 人参与  2024年04月27日 16:23  分类 : 《休闲阅读》  评论

点击全文阅读


spring

        在spring中配置webMvc有两种方法,一种是继承WebMvcConfigurationSupport,另一种方式就是继承WebMvcConfigurer,但是要多加一个@EnableWebMvc注解。

作用:

        WebMvcConfigurer是一个接口,用于配置全局的SpringMVC的相关属性,采用JAVABEAN的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。

        WebMvcConfigurationSupport类是SpringMVC提供的扩展类,用于提供拦截器、资源处理器等注册功能。

常用示例:

        ① 配置路径匹配规则

@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {// 是否使用尾斜杠匹配, 默认为TRUE。TRUE, 表示"/hello"和"/hello/"都能匹配。configurer.setUseTrailingSlashMatch(false); // 为所有的接口添加统一前缀。如果的URL为: "/hello", 则转换为: "/api/hello"configurer.addPathPrefix("api", c -> c.isAnnotationPresent(RestController.class)); // UrlPathHelper是一个处理URL地址的帮助类, 自带了一些优化URL的方法;// 如:getSanitizedPath,就是将"//"自动转换为"/", 所以当输入为"//"也是没有问题的,UrlPathHelper urlPathHelper = new UrlPathHelper();configurer.setUrlPathHelper(urlPathHelper);}

        

        ② 配置静态资源映射器(用于自定义静态资源的映射目录)
// addResourceHandler:用于设置对外暴露的访问路径// addResourceLocations:用于映射内部文件放置的目录,需要以“/”结尾@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {    /** 本地文件上传路径 */    // 对外暴露的访问路径    registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")    // 映射内部文件放置的目录,以“/”结尾            .addResourceLocations("file:" + ServicexConfig.getProfile() + "/");    /** swagger配置 */    registry.addResourceHandler("/swagger-ui/**")            .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");}
        ③ 配置请求拦截器

可以设置多个拦截器,如对特定的URL设定处理规则、打印处理用户请求耗费的时间、定义防止重复提交等功能。

@Overridepublic void addInterceptors(InterceptorRegistry registry) {    // 增加一个拦截器,对请求做一些自定义处理    registry.addInterceptor(new HandlerInterceptor() {        @Override        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {            Object user = request.getSession().getAttribute("loginUser");            if (user == null) {   //未登陆,返回登陆页面                request.setAttribute("msg", "没有权限请先登陆");                request.getRequestDispatcher("/index.html").forward(request, response);                return false;            } else {  //已登陆,放行请求                return true;            }        }    })    // 设置拦截器的过滤路径规则:只拦截/admin/形式的请求    .addPathPatterns("/admin/**")    // 设置不需要拦截的过滤规则:不拦截/admin/login请求    .excludePathPatterns("/admin/login");}

        ④ 跨域设置

方法一:@Overridepublic void addCorsMappings(CorsRegistry registry) {    // 设置允许跨域的路径    registry.addMapping("/**")            // 设置允许跨域请求的域名            .allowedOrigins("*")            // 是否允许证书            .allowCredentials(true)            // 设置允许的方法            .allowedMethods("GET", "POST", "DELETE", "PUT")            // 设置允许的header属性            .allowedHeaders("*")            // 跨域允许时间            .maxAge(3600);}
方法二:/** * 跨域配置 */@Beanpublic CorsFilter corsFilter() {    CorsConfiguration config = new CorsConfiguration();    config.setAllowCredentials(true);    // 设置访问源地址    config.addAllowedOriginPattern("*");    // 设置访问源请求头    config.addAllowedHeader("*");    // 设置访问源请求方法    config.addAllowedMethod("*");    // 有效期 1800秒    config.setMaxAge(1800L);    // 添加映射路径,拦截一切请求    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();    source.registerCorsConfiguration("/**", config);    // 返回新的CorsFilter    return new CorsFilter(source);}
        ⑤ 视图控制器(用于将请求的URL进行处理)
@Overridepublic void addViewControllers(ViewControllerRegistry registry) {    // 如果请求为:/admin,则重定向到/login    registry.addRedirectViewController("/admin", "/login");    // 如果请求为:/admin/delete,则返回500状态    registry.addStatusController("/admin/delete", HttpStatus.INTERNAL_SERVER_ERROR);// 如果请求URL为:/hello,则直接跳转到hello页面registry.addViewController("/hello").setViewName("hello");}
⑥ 内容协商(用于将一个URL直接跳转到页面)
@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {    // 自定义策略    configurer.favorPathExtension(true)// 是否通过请求Url的扩展名来决定mediaType,默认true            .ignoreAcceptHeader(true)// 不检查Accept请求头            .parameterName("mediaType")            .defaultContentType(MediaType.TEXT_HTML)// 设置默认的MediaType            .mediaType("html", MediaType.TEXT_HTML)// 请求以.html结尾的会被当成MediaType.TEXT_HTML            .mediaType("json", MediaType.APPLICATION_JSON)// 请求以.json结尾的会被当成MediaType.APPLICATION_JSON            .mediaType("xml", MediaType.APPLICATION_ATOM_XML);// 请求以.xml结尾的会被当成MediaType.APPLICATION_ATOM_XML}

        ⑦ 信息转化器扩展(自定义FASTJSON为JSON消息的转换器,完成的功能如下)
1、请求返回体使用FASTJSON来序列化;
2、配置如果字段类型为Date,输出为"yyyy-MM-dd HH:mm:ss"格式;
3、配置允许输出值为null的字段;
4、配置字符类型字段,如果为null,输出为"",而非null;
5、配置把Long类型的数据序列化成JSON后传给前端,解决前端可能会出现精度丢失的情况。

@Configurationpublic class MyFastJsonConfig  extends WebMvcConfigurationSupport{    /**     * 使用阿里 fastjson 作为 JSON MessageConverter     * @param converters     */    @Override    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();        FastJsonConfig fastJsonConfig = new FastJsonConfig();        fastJsonConfig.setSerializerFeatures(                // 保留map空的字段                SerializerFeature.WriteMapNullValue,                // 将String类型的null转成""                SerializerFeature.WriteNullStringAsEmpty,                // 将Number类型的null转成0                SerializerFeature.WriteNullNumberAsZero,                // 将List类型的null转成[]                SerializerFeature.WriteNullListAsEmpty,                // 将Boolean类型的null转成false                SerializerFeature.WriteNullBooleanAsFalse,                // 避免循环引用                SerializerFeature.DisableCircularReferenceDetect);        converter.setFastJsonConfig(fastJsonConfig);        //日期格式化        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");        converter.setDefaultCharset(Charset.forName("UTF-8"));        List<MediaType> mediaTypeList = new ArrayList<>();        // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"        mediaTypeList.add(MediaType.APPLICATION_JSON);        converter.setSupportedMediaTypes(mediaTypeList);        converters.add(converter);    }}


点击全文阅读


本文链接:http://zhangshiyu.com/post/101195.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1