springboot-WebMvcConfigurer配置拦截器/跨域/格式化/注册控制器
WebMvcConfigurer
WebMvcConfigurer 是用来全局定制化Spring Boot 的 MVC 特性。开发者通过实现WebMvcConfigurer 接口来配置应用的 MVC 全局特性。
配置类如下:
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* mvc配置类
*/
@Configuration
public class MvcConfigurer implements WebMvcConfigurer {
//拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//将加一个拦截器,检查会话,所有/admin开头的请求都经过此拦截器
registry.addInterceptor(new MyLoginInterceptor()).addPathPatterns("/admin/**");
}
//跨域访问 配置
@Override
public void addCorsMappings(CorsRegistry registry) {
//仅仅允许来自 domain2.com 的跨域访问,并且限定访问路径为/api 、方法是 POST 或者 GET 。
registry.addMapping("/api/**")
.allowedOrigins(" http : //domain2.com")
.allowedMethods(" POST", "GET");
}
//格式化
@Override
public void addFormatters(FormatterRegistry registry) {
//注册一个格式转换器
registry.addFormatter(new DateFormatter ("yyyy-MM-dd"));
}
// URI 到视图的映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//对于index.html的请求,设置返回的视图为index.htl 。
registry.addViewController ("/index.html").setViewName ("/index.htl");
//所有以.do结尾的请求重定向到/index.html请求 。
registry.addRedirectViewController ("/**/*.do","/index.html");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
1. 拦截器
通过 addlnterceptors 方法可以设置多个拦截器,比如对特定的 URI 设定拦截器以检查用户是否登录,打印处理用户请求耗费的时间等。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Author ccl
* @Date 2021/1/3 17:03
*/
public class MyLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//简单逻辑,只有tom能登录
System.out.println("进入拦截器");
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
System.out.println("该用户没有登录");
response.sendRedirect("/login");
return false;
}
return true;
}
@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 {
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
拦截器有以下三个方法需要覆盖实现:
preHandle , 在调用 Controller 方法前会调用此方法 。
postHandle , 在调用 Controller 方法结束后、页面渲染之前调用此方法,比如可以在这
里将渲染的视图名称更改为其他视图名称 。
afterCompletion ,页面渲染完毕后调用此方法 。
2. 跨域访问
Spring Boot 提供了对 CORS 的支持,可以实现 addCorsMappings 接口来添加特定的配置 :
允许所有跨域访问
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping ("/**");
}
- 1
- 2
- 3
- 4
或者更为精细的控制,如下
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins(" http : //domain2.com")
.allowedMethods(" POST", "GET");
}
- 1
- 2
- 3
- 4
- 5
- 6
仅仅允许来自 domain2.com 的跨域访问,并且限定访问路径为/api 、方法是 POST 或者 GET 。
跨域原理简单点理解就是发起跨域请求的时候 , 浏览器会对请求域返回的响应信息检查 HTTP 头 ,如果 Access-Control-Allow-Origin 包含了自身域,则表示允许访问 。 否则报错,这就是 allowedOrigin的作用 。
3. 格式化
//格式化
@Override
public void addFormatters(FormatterRegistry registry) {
//注册一个格式转换器
registry.addFormatter(new DateFormatter ("yyyy-MM-dd"));
}
- 1
- 2
- 3
- 4
- 5
- 6
自定义格式转换器,将入参中名为date且类型为String的参数根据格式,转换为Date类型;
import org.springframework.format.Formatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* @Author ccl
* @Date 2021/1/3 17:39
*/
public class DateFormatter implements Formatter<Date> {
private SimpleDateFormat sf;
public DateFormatter(String format) {
this.sf = new SimpleDateFormat(format);
}
@Override
public Date parse(String date, Locale locale) throws ParseException {
return sf.parse(date);
}
@Override
public String print(Date object, Locale locale) {
return null;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
4. 注册controller
应用有时候没有必要为一个 URL 专门写一个 Controller 方法,可以直接将 URI 请求转到对模板的渲染上 。 比如应用中的如下代码:
// URI 到视图的映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//对于index.html的请求,设置返回的视图为index.htl 。
registry.addViewController ("/index.html").setViewName ("/index.htl");
//所有以.do结尾的请求重定向到/index.html请求 。
registry.addRedirectViewController ("/**/*.do","/index.html");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
如果觉得本文对您有帮助,请点赞支持,非常感谢;