在前面代碼基礎上進行改造;前端
1.SpringBoot經常使用註解java
@SpringBootApplication :指定SpringBoot項目啓動的入口,是一個複合註解,由@Configuration、@EnableAutoConfiguration、@ComponentScan三個註解。
@Configuration:表示將該類做用springboot配置文件類。
@EnableAutoConfiguration:表示程序啓動時,自動加載springboot默認的配置。
@ComponentScan:表示程序啓動是,自動掃描當前包及子包下全部類。
@SpringBootConfiguration:說明這是一個配置文件類,就像xml配置文件,而如今是用java配置文件。
@Value:經過這個註解能夠來讀取.properties或.yml中配置的屬性。
@Bean:這個註解是方法級別上的註解,主要添加在 @Configuration 或
@SpringBootConfiguration 註解的類,有時也能夠添加在 。
@Component 註解的類。它的做用是定義一個Bean。
2.攔截器web
先定義攔截器:spring
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()); } }
看效果:springboot
3.異常處理app
建立異常處理類->加入@Aspect、@Component 註解->對請求連接進行攔截->發生異常以後的異常處理ide
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(); } }