package com.app.mvc.common;
import com.app.mvc.beans.JsonMapper;
import com.app.mvc.beans.Result;
import com.app.mvc.config.GlobalConfig;
import com.app.mvc.config.GlobalConfigKey;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* Created by jimin on 16/4/23.
*/
@Slf4j
public class AllUrlFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("all url filter init config");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String servletPath = req.getServletPath();
// 系统降级处理
if (!ServiceDegarding.isAllowed(servletPath)) {
Map requestMap = request.getParameterMap();
log.info("{} service degarding. parameter:{}", servletPath, JsonMapper.obj2String(requestMap));
serviceDegardingPage(req, resp);
return;
}
// URL QPS 限制
QPSLimiter.acquire(1, servletPath);
// 其他处理,等待补充
chain.doFilter(req, resp);
return;
}
/**
* 服务降级页面
*/
public void serviceDegardingPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String servletPath = request.getServletPath();
request.setAttribute("currentUrl", servletPath);
String requestAccept = request.getHeader("accept");
String contentType = "text/html";
// 无权限访问的页面
String noAuthPage = getServiceDegardingPage();
//判断请求类型
if (StringUtils.isNotEmpty(requestAccept)) {
if (StringUtils.contains(requestAccept, "application/json") || StringUtils.contains(requestAccept, "text/javascript") || StringUtils
.contains(requestAccept, "text/json")) {
contentType = "application/json";
}
}
response.setHeader("Content-Type", contentType + "; charset=UTF-8");
if (contentType.equals("text/html")) {
clientRedirect(response, noAuthPage);
} else if (contentType.equals("application/json")) {
Result result = Result.fail("服务降级,请稍后再试");
response.getWriter().print(JsonMapper.obj2String(result));
} else {
clientRedirect(response, noAuthPage);
}
}
private String getServiceDegardingPage() {
return GlobalConfig.getStringValue(GlobalConfigKey.SERVICE_DEGARDING_PAGE, "/serviceDegarding.do");
}
/**
* 客户端的重定向,将页面重定向为 path?ret=encodeURIComponent(window.location.href)
*/
public static void clientRedirect(HttpServletResponse response, String path) throws IOException {
response.setHeader("Content-Type", "text/html");
response.getWriter().println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" + "<head>\n" + "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"/>\n"
+ "<title>跳转中...</title>\n" + "</head>\n" + "<body>\n" + "跳转中,请稍候...\n" + "<script type=\"text/javascript\">//<![CDATA[\n"
+ "window.location.href='" + path + "?ret='+encodeURIComponent(window.location.href);\n" + "//]]></script>\n" + "</body>\n" + "</html>\n");
}
@Override
public void destroy() {
log.info("all url filter destroy");
}
}