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;
}
}
文章评论