公众号merlinsea
拦截器:springboot会根据访问请求的url来进行拦截,即如果url和我拦截器的配置路径匹配,那么先执行拦截器中的代码,然后再决定是否执行后续的controller-service等其他层的代码。
1、编写拦截器配置类InterceptorConfig
核心:
1、配置类交给spring扫描
2、在registry中添加拦截器并配置拦截路径url
/** * 拦截器配置类,需要实现WebMvcConfigurer接口 * 向拦截器配置类中添加拦截器,并配置路径 */ @Configuration class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //registry中添加拦截器并配置拦截路径 registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/api/v1/pri/**"); registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api/v1/pri/**"); WebMvcConfigurer.super.addInterceptors(registry); } @Bean public LoginInterceptor getLoginInterceptor(){ return new LoginInterceptor(); } }
2、编写LoginInterceptor拦截器类(拦截器类可以有多个),通常会完成登陆校验,敏感词过滤等功能
核心:
1、preHandle中完成核心业务逻辑(返回true放行就执行controller层逻辑,返回false不放行并返回错误信息)
2、实现HandlerInterceptor接口
3、注册到拦截器配置类中
/** * 拦截器类需要实现HandlerInterceptor接口 * * @author lianglin */ public class LoginInterceptor implements HandlerInterceptor { private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("LoginIntercepter preHandle ====="); //获取token String token = request.getHeader("token"); if(StringUtils.isEmpty(token)){ token = request.getParameter("token"); } if(!StringUtils.isEmpty(token)){ //判断token是否合法 User user = UserServiceImpl.sessionMap.get(token); if(user!=null){ //返回true是放行,执行后续的controller逻辑 return true; }else { JsonData jsonData = JsonData.buildError("登录失败,token无效",-2); String jsonStr = objectMapper.writeValueAsString(jsonData); renderJson(response,jsonStr); //返回false是不放行,告诉前端数据无效 return false; } }else { JsonData jsonData = JsonData.buildError("未登录",-3); String jsonStr = objectMapper.writeValueAsString(jsonData); renderJson(response,jsonStr); return false; } } private void renderJson(HttpServletResponse response,String json){ response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); try(PrintWriter writer = response.getWriter()){ writer.print(json); }catch (Exception e){ e.printStackTrace(); } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("LoginIntercepter postHandle ====="); HandlerInterceptor.super.postHandle(request,response,handler,modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("LoginIntercepter afterCompletion ====="); HandlerInterceptor.super.afterCompletion(request,response,handler,ex); } }