SpringWeb基础
关于SpringWeb那是老生常谈的东西了,搭建web环境的方法都记载在了SSM框架搭建方法中,参照即可。这篇笔记是对web一些内容的补充。
一、关于web中如何进行数据校验
SpringWeb对于数据校验提供了支持方式如下:
1、添加依赖:
SpringBoot需要添加starter依赖
Spring需要添加hibernate-validator依赖
<!-- SpringBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
2、使用Java Validation API(JSR303),在实体类上添加校验注解:
public class Person{
@NotNull
@Size(min = 5, max = 25)
private String name;
@Max(value = 7)
@Min(value = 0)
private Integer age;
@Futrue
private Date birthDay;
// getter and setter
}
3、在控制器上需要校验的属性或实体上添加注解@Valid:
// 不进行错误捕获 REST报400
@PostMapping(value = "/person", produces = { "application/json" }, consumes = { "application/json" })
public Person saveTaco(@RequestBody @Valid Person person) {
return personService.savePerson(person);
}
// 进行错误捕获 报内部错误500
@PostMapping(value = "/person", produces = { "application/json" }, consumes = { "application/json" })
public Person saveTaco(
@RequestBody @Valid Person person,
Errors errors) {
return personService.savePerson(person);
}
注意:如果控制器是REST风格的控制器,且控制器没有捕获Errors参数,那么会导致返回状态400。
二、关于异常处理
这里只介绍全局异常处理,局部异常处理同理,只不过处理方法在同一个类中。
1、编写异常处理类
// REST风格的异常处理器
@RestControllerAdvice
public class ExceptionController {
@ExceptionHandler(Exception.class)
public String validException(Exception ex){
System.out.println("---->" + ex);
return "error";
}
}
// 普通的异常处理器
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(Exception.class)
public String validException(Exception ex){
System.out.println("---->" + ex);
return "error";
}
}
处理异常只需要编写一个类,使用@ControllerAdvice或@RestControllerAdvice进行修饰,之后在其中编写异常处理方法,异常处理方法需要使用@ExceptionHandler标注。@ExceptionHandler的属性决定了它要捕获哪种类型的异常,获取异常信息只需要将异常作为参数传递到方法中即可。
三、自定义Filter
SpringBoot中添加自定义Filter
1、自动扫描:
Filter类:
@Order(1)
@WebFilter(filterName = "authFilter", urlPatterns = "/*")
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.debug("start to auth request validate...");
HttpServletRequest req = (HttpServletRequest) request;
String token = req.getHeader("token");
if (token != null) {
// TODO check token
log.info("auth success");
chain.doFilter(request, response);
} else {
log.err("auth failed");
}
}
}
Config类:
@ServletComponentScan(basePackages = {"com.sanro.filter"})
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
log.debug("rest server start success.");
}
}
Filter和之前一样,只需要在配置类上添加@ServletComponentScan进行扫描即可,这种方法也可以用来添加Servlet和Listener。
2、手动配置:
Filter类:
@Component
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.debug("start to auth request validate...");
HttpServletRequest req = (HttpServletRequest) request;
String token = req.getHeader("token");
if (token != null) {
// TODO check token
log.info("auth success");
chain.doFilter(request, response);
} else {
log.err("auth failed");
}
}
}
Config类:
@Configuration
public class FilterConfig {
@Autowired
private AuthFilter authFilter;
@Bean
public FilterRegistrationBean registerAuthFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(authFilter);
registration.addUrlPatterns("/*");
registration.setName("authFilter");
//值越小,Filter越靠前。
registration.setOrder(1);
return registration;
}
//如果有多个Filter,再写一个public FilterRegistrationBean registerOtherFilter(){...}即可。
}
Spring中添加自定义Filter
XML方式直接在web.xml中进行配置即可。
注解方式:
使用AbstractAnnotationConfigDispatcherServletInitializer进行添加:
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{ServiceConfig.class, DaoConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
// 注册Filter
@Override
protected Filter[] getServletFilters() {
return new Filter[]{new CharacterEncodingFilter("utf-8")};
}
// 使用ServletContext进行注册
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addFilter("name", CharacterEncodingFilter.class)
.addMappingForUrlPatterns(null, false, "/*");
}
}
使用getServletFilters()这种方法注册的Filter映射路径和DispatcherServlet的映射路径相同。
使用onStartup(ServletContext servletContext)进行注册,同理还可以注册Servlet和Listener。
四、添加Interceptor
使用配置文件配置:
使用配置类配置:
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
SpringBoot在添加拦截器时不可以在配置类上添加@EnableWebMvc注解,否则默认配置失效,web部分内容全部变为手动配置。

本文补充了SpringWeb的基础知识,包括数据校验的步骤,如添加依赖、使用JSR303注解;异常处理的全局方法,通过@ControllerAdvice和@ExceptionHandler;SpringBoot和Spring中自定义Filter的两种方式;以及Interceptor的配置方法,既可以通过配置文件,也可以通过配置类。
391

被折叠的 条评论
为什么被折叠?



