Go实现网页 临时电脑目录访问

简介

下载好电影电视剧但是又不想呆在电脑旁边, 你可能只需要开启一个Go服务, 简单几句代码....

实现

  1. 中间件
    做一个简单的包装器, 用于处理所有外部访问。

  2. IP过滤器
    过滤IP, 对不符合的IP进行过滤

步骤

代码

IP过滤器

filter.go

package mainimport "errors"var (FliterParameterError = errors.New("parameter error")
)type IFilterResult interface {IsOK() boolLastError() error
}type IFilter interface {Filter(v interface{}) IFilterResult
}type oker struct {
}func (o *oker) IsOK() bool {return true
}func (o *oker) LastError() error { return nil }type notOker struct {err error
}func (o *notOker) IsOK() bool {return false
}func (o *notOker) LastError() error { return o.err }

ipfilter.go

package mainimport "errors"var (FliterBlackListError = errors.New("blacklist error")
)type IPFilter struct {whites []stringblacks []string
}func NewIPFliter(whiteIPs []string, blackIPs []string) IFilter {return &IPFilter{whites: whiteIPs, blacks: blackIPs}
}func (t *IPFilter) Filter(v interface{}) IFilterResult {str, ok := v.(string)if !ok {return &notOker{err: FliterParameterError}}ok, err := t.filter(str)if ok {return &oker{}}return &notOker{err: err}
}func (t *IPFilter) filter(str string) (ok bool, err error) {for i := range t.whites {if str == t.whites[i] {ok = truereturn}}for i := range t.blacks {if str == t.blacks[i] {ok = falseerr = FliterBlackListErrorreturn}}return
}
中间件

middleware.go

package mainimport ("fmt""net/http""strings"
)type Wrapper struct {httpHandler http.Handlerfilter      IFilter
}func NewWrapper(h http.Handler, filter IFilter) *Wrapper {var (wrp = &Wrapper{httpHandler: h, filter: filter})return wrp
}func (wrp *Wrapper) HttpHandler() http.Handler {return http.HandlerFunc(wrp.handle)
}/* handle: 所有外部访问都会经过这里 */
func (wrp *Wrapper) handle(w http.ResponseWriter, r *http.Request) {fliter := wrp.filter.Filter(wrp.getClientIP(r))if !fliter.IsOK() {wrp.writeWelcomView(w, r, fliter.LastError())return}wrp.httpHandler.ServeHTTP(w, r)
}func (wrp *Wrapper) writeWelcomView(w http.ResponseWriter, r *http.Request, err error) {fmt.Fprintf(w, "<html><head><title>非法访问</title></head><body>")fmt.Fprintf(w, "<h1>Welcom!!!!<h1>")fmt.Fprintf(w, "<h2>您还不是白名单用户,请联系亲爱的管理员同志!(温馨提醒, 别打人!) </h2>")fmt.Fprintf(w, "<h3>您的IP地址是: %s</h3>", wrp.getClientIP(r))if nil != err {fmt.Fprintf(w, "<p>errMsg : %s</p>", err.Error())}fmt.Fprintf(w, "</body></html>")
}func (wrp *Wrapper) getClientIP(r *http.Request) string {// 获取客户端IP地址clientIP := r.RemoteAddr// 如果服务器后面有代理,使用X-Forwarded-For或X-Real-IP获取真实的客户端IPif xff := r.Header.Get("X-Forwarded-For"); xff != "" {clientIP = xff} else if xri := r.Header.Get("X-Real-IP"); xri != "" {clientIP = xri}strs := strings.Split(clientIP, ":") // ip:portif 0 < len(strs) {return strs[0]}return clientIP
}
main
package mainimport ("log""net/http"
)func main() {mux := http.NewServeMux()ipfilter := NewIPFliter([]string{ // 可以访问的IP"192.168.3.42", // 本机IP}, []string{ // 不能访问的IP})warpper := NewWrapper(mux, ipfilter)mux.Handle("/dsj/", http.StripPrefix("/dsj/", http.FileServer(http.Dir("D:\\AppData\\XmpCache\\电视剧"))))if err := http.ListenAndServe(":1020", warpper.HttpHandler()); err != nil {log.Fatal(err)}
}

共赏

Go实现简易网页电脑目录访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion学习线路,提示词及资源分享

1. 提示词的基础概念 提示词分为正面提示词&#xff08;Prompts&#xff09;和反面提示词&#xff08;Negative Prompts&#xff09;。正面提示词代表你希望画面中出现的内容&#xff0c;而反面提示词代表你不希望画面中出现的内容。提示词通常是以英文书写&#xff0c;最小单…

nginx--压缩https证书favicon.iconginx隐藏版本号 去掉nginxopenSSL

压缩功能 简介 Nginx⽀持对指定类型的⽂件进行压缩然后再传输给客户端&#xff0c;而且压缩还可以设置压缩比例&#xff0c;压缩后的文件大小将比源文件显著变小&#xff0c;这样有助于降低出口带宽的利用率&#xff0c;降低企业的IT支出&#xff0c;不过会占用相应的CPU资源…

逻辑回归实战 -- 是否通过考试

http://链接: https://pan.baidu.com/s/1-uy-69rkc4WjMpPj6iRDDw 提取码: e69y 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 数据集下载链接 这是个二分类问题&#xff0c;通过x1,x2两个指标得出是否通过考试的结论。 逻辑回归的激活函数是sigmoid函数&…

数学符号的标准写法 (机器学习方向)

摘要: 本贴讨论数学符号的标准写法, 列出 Latex 中使用的命令. 表 1. 矩阵相关符号 符号/操作意义Latex 命令 A \mathbf{A} A矩阵\mathbf{A} A i \mathbf{A}_{i} Ai​带下标的矩阵, 注意不是矩阵的元素 (entry)\mathbf{A}_{i} A i j \mathbf{A}_{ij} Aij​带双下标的矩阵矩阵\m…

【004_音频开发_基础篇_ALSA插件使用】

004_音频开发_基础篇_ALSA插件使用 文章目录 004_音频开发_基础篇_ALSA插件使用创作背景/etc/asound.conf 示例分析默认设备/默认控制器/plug插件softvol 插件采样率转换插件pcm.audio_processing 创作背景 学历代表过去、能力代表现在、学习力代表将来。 一个良好的学习方法是…

用git上传本地文件到github

两种方式&#xff1a;都需要git软件&#xff08;1&#xff09;VScode上传 &#xff08;2&#xff09;直接命令行&#xff0c;后者不需要VScode软件 &#xff08;1&#xff09;vscode 上传非常方便&#xff0c;前提是下载好了vscode和git软件 1 在项目空白处右击&#xff0c;弹…

SpringCloud微服务项目创建流程

为了模拟微服务场景&#xff0c;学习中为了方便&#xff0c;先创建一个父工程&#xff0c;后续的工程都以这个工程为准&#xff0c;实用maven聚合和继承&#xff0c;统一管理子工程的版本和配置。 后续使用中只需要只有配置和版本需要自己规定之外没有其它区别。 微服务中分为…

Redis---------实现更改数据业务,包括缓存更新,缓存穿透雪崩击穿的处理

三种更新策略 内存淘汰是Redis内存的自动操作&#xff0c;当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire)&#xff0c;有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新&#xff0c;所以接下来研究主动更新策略。 主动更新策略…

【数据结构(邓俊辉)学习笔记】向量06——位图

文章目录 0.概述1.结构2.实现3. 应用3.1 去重3.2 筛法 0.概述 位图&#xff08;Bitmap&#xff09;是一种特殊的序列结构&#xff0c;可用以动态地表示由一组&#xff08;无符号&#xff09;整数构成的集合。 test() 判断k 是否存在集合S中。set() 将k 加入到集合S中。clear…

每日OJ题_贪心算法二④_力扣2418. 按身高排序

目录 力扣2418. 按身高排序 解析代码 力扣2418. 按身高排序 2418. 按身高排序 难度 简单 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个…

【Unity】在空物体上实现 IPointerClickHandler 不起作用

感谢Unity接口IPointerClickHandler使用说明_哔哩哔哩_bilibiliUnity接口IPointerClickHandler使用说明, 视频播放量 197、弹幕量 0、点赞数 3、投硬币枚数 2、收藏人数 2、转发人数 0, 视频作者 游戏创作大陆, 作者简介 &#xff0c;相关视频&#xff1a;在Unity多场景同时编辑…

京东初级运营必修课程,从零开始学习(49节课)

课程内容&#xff1a; 01.1.全面解析店铺后台的各项功能 02.2.商品要素的重要性及如何打造黄金标题 03.3.手把手带你完成商品上架 04.4.为啥你的流量不转化-诸葛 05.5.怎么策划一张高点击率的照片 06.6.内功优化之数据化标题创建 07.7.内功优化之如何高转化活动落地页 …

node应用部署运行案例

生产环境: 系统&#xff1a;linux centos 7.9 node版本&#xff1a;v16.14.0 npm版本:8.3.1 node应用程序结构 [rootRainYun-Q7c3pCXM wiki]# dir assets config.yml data LICENSE node_modules nohup.out output.log package.json server wiki.log [rootRainYun-Q7c…

SpringBoot集成Log2j4指定外部配置文件源码解读

一、背景 程序读取外部log4j2.xml配置文件方式为启动命令添加了--logging.config/path/log4j2.xml&#xff0c;因系统安全整改&#xff0c;将/var/log/目录改为了700&#xff0c;程序使用非root启动时log4j2报错无法在/var/log目录下创建日志文件。经排查发现jar包的classpath…

python的self类

在Python的类&#xff08;class&#xff09;定义中&#xff0c;self 是一个变量名&#xff0c;它代表实例本身。在类定义的方法中&#xff0c;self 总是作为第一个参数&#xff0c;并且这是一个约定俗成的用法。通过 self&#xff0c;你可以访问和操作类的属性&#xff08;vari…

Nacos如何支持服务发现和注册?

Nacos如何支持服务发现和注册 在微服务架构的浪潮中&#xff0c;服务发现和注册成为了支撑整个架构稳定运行的关键技术之一。而Nacos&#xff0c;作为阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台&#xff0c;凭借其简单易用、功能强大的特性&#xff0c;受到了广…

我的创作纪念日—128天的坚持|分享|成长

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

C++进阶-----继承

1、继承的概念和定义 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层次结构&#xf…

Docker-Compose概述与简单编排部署

目录 前言 一、Docker-Compose 概述 1、Docker-Compose 概念 2、Docker-Compose 优缺点 2.1 Docker-Compose 优点 2.2 Docker-Compose 缺点 3、Docker-Compose与Docker-Swarm的区别 二、两大文件格式 1、YAML 文件格式 2、JOSON 文件格式 3、YAML 与 JOSON 格式的区…

用Rust编写Python扩展

一、用Rust编写Python扩展 用Rust编写Python扩展是完全可行的&#xff0c;并且近年来变得越来越流行。Rust是一种内存安全的语言&#xff0c;它提供了与C语言类似的底层访问能力&#xff0c;但具有更强大的内存安全和并发特性。 为了使用Rust编写Python扩展&#xff0c;你可以…