长大后想做什么?做回小孩!

0%

SpringBoot使用转换器和拦截器

上一次主要介绍了转换器和拦截器的一般实现方法和在SSM套装中的配置方法。这次记录一下在SpringBoot中使用二者的方法和一些问题。

拦截器:

首先实现一个登录校验拦截器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class UserInterceptor implements HandlerInterceptor {
// 在controller之前调用
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getSession().getAttribute("loginUser")==null){
request.getSession().setAttribute("message","请登录");
request.getRequestDispatcher("WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}else {
return true;
}
}
// 此方法在controller调用之后,跳转视图之前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
// 整个请求结束之后调用此方法
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}
}

然后创建一个配置类去继承WebMvcConfigurationSupport,并且重写父类的addInterceptors(InterceptorRegistry registry)方法:

1
2
3
4
5
6
7
8
9
//配置类
@Component
public class Configuration extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInterceptor()).addPathPatterns("/**").excludePathPatterns("/login","/toLogin");
super.addInterceptors(registry);
}
}

启动!拦截器就会生效了!

但是,这里有一个很讨厌的情况就出现了!之前好好的视图都解析失败了(之前properties中配置的视图解析器失效了)!原因应该是:手动创建了配置类后WebMvcConfigurationSupport创建了新的ViewResolver!

那就尝试在配置类中加入下列代码,自定义一个ViewResolver:

1
2
3
4
5
6
7
@Bean
public ViewResolver getViewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
return resolver;
}

问题得到了解决!但是值得吐槽!


转换器:

最基础的、也很常用的时间转换器作为例子。

常见的几种日期格式化的情况:

  1. jsp中使用JSTL的format标签库在前端进行日期格式化

    1
    <fmt:formatDate value="${user.creattime}" pattern="yyyy-MM-dd HH:mm:ss"/>
  2. application.properties中对请求处理器的JSON返回值的日期的格式化配置,前端拿到后不需要处理就获的已格式化的日期:

    1
    2
    3
    #格式化时间
    spring.jackson.date-format=yyyy/MM/dd hh:mm:ss
    spring.jackson.time-zone=GMT+8
  3. 使用转换器:后端处理器接收到的前端传参来的日期一般是String类型的,不能直接自动赋值给后端的Date格式的变量,这时就要用到自定义Converter了!SpringBoot和SpringMVC使用转换器的区别:

    区别很明显!SpringBoot不需要进行xml配置!!直接在实现的dateConverter上加上@Component注解,SpringBoot默认的自动配置就会将实现的dateConverter扫描并加载到容器中以备使用!当前端传回来Sring类型的日期时,自动会进到dateConverter中调用convert()方法进行解析格式化!

    转换器的介绍和实现方法在开头链接博文:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       @Component
    public class dateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
    Date date = null;
    try {
    date = sdf.parse(s);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return date;
    }
    }

    运行时通过Debug发现,dateConverter已经自动被扫描和加载了:

nfTzZ9.png