SpringFrameworkWeb补充

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

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部分内容全部变为手动配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值