|
|
@@ -0,0 +1,54 @@
|
|
|
+package platform.config.crsf;
|
|
|
+
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.net.MalformedURLException;
|
|
|
+
|
|
|
+@Component
|
|
|
+@Slf4j
|
|
|
+public class RefererInterceptor extends HandlerInterceptorAdapter {
|
|
|
+ @Autowired
|
|
|
+ private RefererProperties refererProperties;
|
|
|
+ @Override
|
|
|
+ public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
|
|
|
+ //是否开启referer拦截器
|
|
|
+ if(!refererProperties.getEnabled()){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ String referer = req.getHeader("referer");
|
|
|
+ String host = req.getServerName();
|
|
|
+ // 若无referer,放行
|
|
|
+ if (referer == null) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ java.net.URL url = null;
|
|
|
+ try {
|
|
|
+ url = new java.net.URL(referer);
|
|
|
+ } catch (MalformedURLException e) {
|
|
|
+ // URL解析异常,也置为404
|
|
|
+ resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ String refererUrl = url.getHost();
|
|
|
+ // 首先判断请求域名和referer域名是否相同
|
|
|
+ if (!host.equals(refererUrl)) {
|
|
|
+ // 若是不等,判断是否在白名单中
|
|
|
+ log.info("RefererInterceptorConfig-->\nrefererUrl:{}\nhost:{}\nrefererProperties:{}", refererUrl, host, refererProperties);
|
|
|
+ if (refererProperties.getRefererDomain() != null) {
|
|
|
+ for (String s : refererProperties.getRefererDomain()) {
|
|
|
+ if (s.equals(refererUrl)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+}
|