SpringBoot的拦截器HandlerInterceptor下,我们在public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o)下进行了拦截,对不符合条件的请求,我们一般是返回一个非200的状态代码,例如:
@Component public class PersonalInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) { // 如果不是映射到方法直接通过 if (!(o instanceof HandlerMethod)) { return true; } String token = request.getHeader("token"); if (StringUtils.isEmpty(token)) { token = request.getHeader("X-Token"); } if (StringUtils.isEmpty(token)) { token = request.getParameter("token"); } // 例如通过一定的方式检测token是否合法 if (Utils.isValid(token)) { throw new HttpClientErrorException(HttpStatus.UNAUTHORIZED, "Forbidden"); //返回401 UNAUTHORIZED 状态代码 } return true; } }
现在遇到另外一个需求,没有符合一定条件的请求,需要返回标准的JSON,或者其他返回数据,但是状态代码还是200
preHandle方法,有一个reponse参数,我们就可以在response下输出数据,然后return false(即处理完毕了)
@Component public class PersonalInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) { // 如果不是映射到方法直接通过 if (!(o instanceof HandlerMethod)) { return true; } String token = request.getHeader("token"); if (StringUtils.isEmpty(token)) { token = request.getHeader("X-Token"); } if (StringUtils.isEmpty(token)) { token = request.getParameter("token"); } // 例如通过一定的方式检测token是否合法 if (Utils.isValid(token)) { try { ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json; charset=utf-8"); // 这里是我封装的统一返回的Object,你也可以直接返回string,或者你的统一标准的Object response.getWriter().write(mapper.writeValueAsString(JsonResult.fail("请怎么样请怎么样"))); return false; } catch (IOException ignored) { } } return true; } }
文章评论