默认在触发限流策略后,系统会显示:
根据该关键字,在项目中进行查找,找到了该类:
接着一步一步的查找,
类:
FilterUtil
private static void writeDefaultBlockedPage(HttpServletResponse response) throws IOException { PrintWriter out = response.getWriter(); out.print(DEFAULT_BLOCK_MSG); out.flush(); out.close(); }
com.alibaba.csp.sentinel.adapter.servlet.util.FilterUtil
public static void blockRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { StringBuffer url = request.getRequestURL(); if ("GET".equals(request.getMethod()) && StringUtil.isNotBlank(request.getQueryString())) { url.append("?").append(request.getQueryString()); } if (StringUtil.isBlank(WebServletConfig.getBlockPage())) { writeDefaultBlockedPage(response); } else { String redirectUrl = WebServletConfig.getBlockPage() + "?http_referer=" + url.toString(); // Redirect to the customized block page. response.sendRedirect(redirectUrl); } }
最终定位到了:
public class DefaultUrlBlockHandler implements UrlBlockHandler { @Override public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException { // Directly redirect to the default flow control (blocked) page or customized block page. FilterUtil.blockRequest(request, response); } }
因此,很容易了解到,sentinel默认采用了DefaultUrlBlockHandler类做统一的默认异常处理。
所以,要向定义特殊的限流异常页面,可以简单的通过实现UrlBlockHandler接口,来定义属于自身的特殊异常处理界面。
如:
@Component public class CustomUrlBlockHandler implements UrlBlockHandler { @Override public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException { httpServletResponse.setHeader("Content-Type","application/json;charset=UTF-8"); String message="{\"code\":999,\"msg\":\"访问人数太多,限流\"}"; httpServletResponse.getWriter().write(message); } }
启动工程后的运行效果:
可以看出,修改已经生效。
另外,新版的sentinel中已经发生了变化,可以采用这种方式来进行修改:
FlowException //限流异常
DegradeException //降级异常
ParamFlowException //参数限流异常
SystemBlockException //系统负载异常
AuthorityException //授权异常