SpringBoot系统列 4 - 常用注解、拦截器、异常处理

在前面代码基础上进行改造;

1.SpringBoot常用注解

@SpringBootApplication :指定SpringBoot项目启动的入口,是一个复合注解,由@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解。

@Configuration:表示将该类作用springboot配置文件类。

@EnableAutoConfiguration:表示程序启动时,自动加载springboot默认的配置。

@ComponentScan:表示程序启动是,自动扫描当前包及子包下所有类。

@SpringBootConfiguration:说明这是一个配置文件类,就像xml配置文件,而现在是用java配置文件。

@Value:通过这个注解可以来读取.properties或.yml中配置的属性。

@Bean:这个注解是方法级别上的注解,主要添加在 @Configuration 或 

@SpringBootConfiguration 注解的类,有时也可以添加在 。

@Component 注解的类。它的作用是定义一个Bean。

 

 

2.拦截器

先定义拦截器:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器
 * @author XIHONGLEI
 * @date 2018-11-02
 */
public class ApiInterceptor implements HandlerInterceptor {

    /**
     * 请求之前访问
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("请求之前拦截...");
        return true;
    }

    /**
     * 请求时访问
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("请求中拦截...");
    }

    /**
     * 请求完成后访问
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("请求完成后拦截...");
    }
}

再将自定义拦截器添加注册进系统

import com.hello.filter.ApiInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 * 配置类
 * @author XIHONGLEI
 * @date 2018-10-31
 */
@SpringBootConfiguration
public class WebConfig extends WebMvcConfigurationSupport {

   
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        super.addInterceptors(registry);
        // 将 ApiInterceptor 拦截器类添加进去
        registry.addInterceptor(new ApiInterceptor());
    }
}

看效果:

 

3.异常处理

创建异常处理类->加入@Aspect、@Component 注解->对请求链接进行拦截->发生异常之后的异常处理

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 异常拦截处理
 *
 * @author XIHONGLEI
 * @date 2018-11-02
 */
@Aspect
@Component
public class WebExceptionAspect {
    //凡是注解了RequestMapping的方法都被拦截
    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    private void webPointcut() {
        System.out.println("请求被拦截...");
    }

    /**
     * 拦截web层异常,记录异常日志,并返回友好信息到前端
     * 目前只拦截Exception,是否要拦截Error需再做考虑
     * @param e 异常对象
     */
    @AfterThrowing(pointcut = "webPointcut()", throwing = "e")
    public void handleThrowing(Exception e) {
        System.out.println("出现异常:");
        e.printStackTrace();
        // 输出错误提示到浏览器
        writeContent("您请求的链接出现异常,请重试!");
    }

    /**
     * 将内容输出到浏览器
     * @param content 输出内容
     */
    private void writeContent(String content) {
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        response.reset();
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Type", "text/plain;charset=UTF-8");
        response.setHeader("icop-content-type", "exception");
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.print(content);
        writer.flush();
        writer.close();
    }
}

 

posted @ 2018-11-15 10:41 Bodi 阅读(...) 评论(...) 编辑 收藏