• Referer拦截器


    #Referer拦截
    referer:
      enabled: true
      #支持配置多个域名,以,分隔。
      domains: 127.0.0.1,localhost
    //Referer拦截器
    //@Component
    public class RefererInterceptor implements HandlerInterceptor {
        Logger log = LoggerFactory.getLogger(getClass());
    
        //是否启用拦截。默认不启用
        @Value("${referer.enabled:false}")
        private Boolean referer_enabled;
        //白名单域名。支持配置多个域名,以,分隔。
        @Value("${referer.domains:}")
        private List<String> referer_domains;
    
        @Override
        public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
            if (referer_enabled && referer_domains.size() > 0) {
                String referer = req.getHeader("referer");
                String host = req.getServerName();
    
                //空referer,浏览器直接访问,放行。
                if (referer == null) {
                    return true;
                }
    
                String refererHost;
                try {
                    java.net.URL url = new java.net.URL(referer);
                    refererHost = url.getHost();
                } catch (MalformedURLException e) {
                    // URL解析异常,也置为404
                    resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
                    resp.getWriter().write("非法请求,不是同源的访问。");
                    resp.flushBuffer();
                    return false;
                }
    
                //referer和host相同,同源的链接,放行。
                if (refererHost.equals(host)) {
                    return true;
                }
    
                //referer和host不同。判断是否在白名单。referer在白名单,放行。
                if (referer_domains.contains(refererHost)) {
                    return true;
                }
    
                //referer和host不同。且不在白名单。
                log.error("referer: " + referer + ", host:" + host);
                resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
                resp.getWriter().write("非法请求,不是同源的访问。");
                resp.flushBuffer();
                return false;
            }
            return true;
        }
    }
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        //@Autowired
        //RefererInterceptor refererInterceptor;
        @Bean
        public RefererInterceptor refererInterceptor() {
            return new RefererInterceptor();
        }
    
        //注册拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //referer拦截
            //registry.addInterceptor(refererInterceptor);
            registry.addInterceptor(refererInterceptor());
        }
    }
  • 相关阅读:
    C#中泛型学习笔记
    ASP.NET C#各种数据库连接字符串大全——SQLServer、Oracle、Access
    单点登录SSO
    Package Manager Console 向VS2010安装 EntityFramework
    JavasSript中类的实现(1)
    Java线程实现提供者消费者模式
    MySQL插入语句解决唯一键约束
    【BZOJ4000】【LOJ2104】【TJOI2015】棋盘 (状压dp + 矩阵快速幂)
    【AGC005F】Many Easy Problems (NTT)
    【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)
  • 原文地址:https://www.cnblogs.com/xsj891107/p/16096484.html
Copyright © 2020-2023  润新知