赞
踩
@Slf4j @Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception { //返回true表示不进行拦截 log.info("执行了登录拦截器的preHandle方法"); //获取session,判断session存储的userinfo信息是否为空 //true表示如果有session就返回session,如果没有就创建 HttpSession session = request.getSession(false); if (session == null) { return false; } UserInfo attribute = (UserInfo) session.getAttribute(Constants.USER_SESSION_KEY); if (attribute == null||attribute.getId()<=0) { response.setStatus(401); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("执行了登录拦截器的postHandle方法"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("执行了登录拦截器的afterCompletion方法"); } }
@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; //添加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { //注册拦截器,并告诉他拦截路径 registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") .excludePathPatterns("/user/login") .excludePathPatterns("/css/**") .excludePathPatterns("/js/**") .excludePathPatterns("/pic/**") .excludePathPatterns("/**/*.html") ; } }
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { //⾃定义的拦截器对象 @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //注册⾃定义拦截器对象 registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") .excludePathPatterns("/user/login");//设置拦截器拦截的请求路径 (/** 表⽰拦截所有请求) } }
拦截路径 | 含义 | 举例 |
---|---|---|
/* | 一级路径 | 能匹配/user,/book,/login,不能匹配 /user/login |
/** | 任意级路径 | 能匹配/user,/user/login,/user/reg |
/book/* | /book下的一级路径 | 能匹配/book/addBook,不能匹配/book/addBook/1,/book |
/book/** | /book下的任意级路径 | 能匹配/book,/book/addBook,/book/addBook/2,不能匹配/user/login |
什么是适配器模式:
适配器模式, 也叫包装器模式. 将一个类的接口,转换成客户期望的另一个接口, 适配器让原本接口不兼容的类可以合作无间. 简单来说就是==目标类不能直接使用, 通过一个新类进行包装一下, 适配调用方使用. 把两个不兼容的接口通过一定的方式使之兼容.
前面学习的slf4j 就使用了适配器模式, slf4j提供了一系列打印日志的api, 底层调用的是log4j 或者 logback来打日志, 我们作为调用者, 只需要调用slf4j的api就行了.
public interface Slf4jLog {
void log(String msg);
}
public class Log4j {
public void log(String msg) {
System.out.println("我是Log4j,需要打印的信息为: "+msg);
}
}
public class Log4jAdapter implements Slf4jLog{
private Log4j log4j;
public Log4jAdapter(Log4j log4j){
this.log4j = log4j;
}
@Override
public void log(String msg) {
//使用Log4j进行打印
log4j.log("我是适配器,打印的信息为: "+msg);
}
}
public class Main {
public static void main(String[] args) {
Slf4jLog slf4jLog = new Log4jAdapter(new Log4j());
slf4jLog.log("我是客户端");
}
}
运行结果:
快速入门:
统一的数据返回格式使用 @ControllerAdvice 和 ResponseBodyAdvice 的方式实现
@ControllerAdvice 表示控制器通知类, 添加类 ResponseAdvice , 实现ResponseBodyAdvice 接口, 并在类上添加@ControllerAdvice 注解.
@ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice<Object> { //序列化 @Autowired private ObjectMapper objectMapper; @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { // if(returnType.getMember().) //是否需要处理 return true; } @SneakyThrows @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (body instanceof Result) { return body; } if (body instanceof String) { //序列化String return objectMapper.writeValueAsString(Result.success(body)); } return Result.success(body); } }
添加统一数据返回格式之前:
添加统一数据返回格式之后:
统⼀异常处理使用的是 @ControllerAdvice + @ExceptionHandler 来实现的,
@ControllerAdvice 表示控制器通知类, @ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件
@Slf4j @ControllerAdvice @ResponseBody //如果不加会认为你返回的是一个视图,这个视图显然不存在,就会出现404的错误 public class ExceptionAdvice { @ExceptionHandler(value = Exception.class) public Result handleException(Exception e) { log.error("发生异常, e : "+ e); return Result.fail("内部错误"); } @ExceptionHandler() public Result handleException(NullPointerException e) { log.error("发生空指针异常, e : "+ e); return Result.fail("内部错误"); } @ExceptionHandler(ArithmeticException.class) public Result handleException(ArithmeticException e) { log.error("发生算术异常, e : "+ e); return Result.fail("内部错误"); } }
模拟制造异常:
@RequestMapping("/test") @RestController public class TestController { @RequestMapping("/t1") public String t1(){ int result = 10/0; return "string"; } @RequestMapping("/t2") public Integer t2(){ String str = null; System.out.println(str.length()); return 1; } @RequestMapping("/t3") public Boolean t3(){ Integer[] integers = new Integer[]{1,2,3,4}; System.out.println(integers[5]); return true; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。