开发外贸网站开发,怎样做app推广,基于php网站开发环境,在百度搜索到自己的网站拦截器定义拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执 ⾏预先设定的代码.实现拦截器1. 定义拦截器创建类#xff0c;实现HandlerInterceptor接口#xff0c;重写preHandle和postHandle两个方法#xff0c;在方法中实现…拦截器定义拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执 ⾏预先设定的代码.实现拦截器1. 定义拦截器创建类实现HandlerInterceptor接口重写preHandle和postHandle两个方法在方法中实现拦截器逻辑其中preHandle方法是在controller类之前进行用于检查postHandle是controller实现完成后或者拦截成功后逆序进行用于收尾。实现流程假设拦截器有三个功能情况一放行调用preHandle方法实现功能123如果放行则调用controller方法完成后调用postHandle方法实现功能321情况二拦截调用preHandle方法实现功能123在第3个功能处拦截随后跳过controller方法调用postHandle方法只实现功能21。因为3并没有在preHandle实现。package com.spring.bookmanage.interceptor; import com.spring.bookmanage.constant.Constants; import com.spring.bookmanage.entity.Result; import com.spring.bookmanage.entity.UserInfo; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; Slf4j Component public class LoginInterceptor implements HandlerInterceptor{ Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info(目标代码执行前); HttpSession session request.getSession(false); if(!checkStatus(session)){ response.setStatus(401); return false; } //true放行false拦截 return true; } Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info(目标方法执行后); } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info(完成后); } public boolean checkStatus(HttpSession session) { if(sessionnull||(session.getAttribute(Constants.SESSION_USER_INFO)null)){ //用户未登录 return false; } UserInfo userInfo(UserInfo)session.getAttribute(Constants.SESSION_USER_INFO); if ((userInfonull)||(userInfo.getId()0)){ //用户未登录 return false; } return true; } }2. 注册拦截器创建类实现WebMvcConfigurer接口实例化LoginInterceptor类并重写addInterceptors⽅法方法中定义拦截路径/book/**package com.spring.bookmanage.config; import com.spring.bookmanage.interceptor.LoginInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; 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(/book/**); } }通过打印日志可以看到拦截器生效红框标出拦截路径Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns(/**) .excludePathPatterns(/user/login);//设置拦截器拦截的请求路径 (/** 表⽰拦截所有请求) }统一数据返回格式该功能将统一格式返回前端实现创建类实现ResponseBodyAdvice接口重写supports和beforeBodyWrite方法。supports方法: 判断是否要执行beforeBodyWrite方法. true为执行, false不执行. 通过该方法可以选择哪些类或哪些方法的response要进行处理, 其他的不进行处理.beforeBodyWrite方法: 对response方法进行具体操作处理package com.spring.bookmanage.config; import com.spring.bookmanage.entity.BookInfo; import com.spring.bookmanage.entity.Result; import lombok.SneakyThrows; import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import tools.jackson.databind.ObjectMapper; ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice { Autowired private ObjectMapper objectMapper; Override public boolean supports(MethodParameter returnType, Class converterType) { //false:不处理 true:处理 return true; } SneakyThrows Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if(body instanceof String){ return objectMapper.writeValueAsString(Result.success(body)); } if(body instanceof Result){ return body; } return Result.success(body); } }统⼀异常处理统⼀异常处理使用的是 ControllerAdvice ExceptionHandler 来实现的, ControllerAdvice 表⽰控制器通知类ExceptionHandler 是异常处理器两个结合表示当出现异常的时候执行某个通知也就是执行某个方法事件package com.spring.bookmanage.config; import com.spring.bookmanage.entity.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; Slf4j ControllerAdvice ResponseBody public class ExceptionAdvice { ExceptionHandler public Result handler(Exception e){ log.error(error: e); return Result.fail(inner error); } }三组件及Controller背后的调度者DispatcherServlet我们看看Spring是怎么实现的, 还是从 DispatcherServlet 的代码开始分析。DispatcherServlet 对象在创建时会初始化一系列的对象源码过于复杂笔者作为和各位读者同样甚至更加稚嫩的初学者就不大量展示了以下为一小部分DispatcherServlet源码public class DispatcherServlet extends FrameworkServlet { //... protected void initStrategies(ApplicationContext context) { initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); //url-方法映射 initHandlerAdapters(context); //适配器可理解为统一接口格式工具 initHandlerExceptionResolvers(context); //异常处理器 initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); } //...springboot启动时由Servlet容器在80端口默认监听并且DispatchServlet类启动初始化这九大对象其中就包括url-方法映射这就是我们的controller适配器异常处理机制等。当请求某个方法DispatcherServlet调用拦截器对请求进行检验如果没有问题则放行如果有问题则直接跳过controller调用当请求被拦截器放行DispatcherServlet查找所有Controller方法找到对应的请求路径的方法调用当返回某个结果DispatcherServlet查找所有结果统一格式方法调用并封装结果返回当出现异常DispatcherServlet查找所有异常处理找到合适的异常处理方法并调用。总结本章节主要介绍了SpringBoot 对⼀些统⼀功能的处理⽀持.1. 拦截器的实现主要分两部分: 定义拦截器(实现HandlerInterceptor 接口) 配置拦截器2. 统⼀数据返回格式通过ControllerAdvice ResponseBodyAdvice 来实现3. 统⼀异常处理使⽤ControllerAdvice ExceptionHandler 来实现, 并且可以分异常来处理4. 学习了DispatcherServlet的一点点源码