内网穿透是一种技术,可以让外网用户通过互联网访问内网服务,其用途非常广泛。下面列举几个常见的内网穿透用途:
远程办公:在远程办公的情况下,员工需要访问公司内网的资源,如文件、ERP、财务软件、数据库、邮件等。
网络游戏:有些网络游戏需要在内网中进行局域网游戏,但是由于玩家之间的距离较远,无法直接连接到同一内网中。
远程控制:有些设备或机器需要通过内网连接,例如摄像头、NAS存储、智能家居等。
这些场景都可以通过内网穿透来解决,不需要公网IP,也不用设置路由器,本地环境配置一个内网穿透工具即可。
而市面上已经有很多成熟的内网穿透工具,本文盘点了国内免费使用的国产最强内网穿透软件,可以参考选择适合的工具来下载使用,排名不分先后。
官网地址:https://hsk.oray.com/
免费版功能
免费带宽:1M
免费隧道:2条
限制流量:1G/月
并发连接数:50个
访问地址不强制改变
支持操作系统:windows (有界面客户端)
支持操作系统:Linux
优点
缺点
官网地址:https://www.shenzhuohl.com/chuantou.html
基本信息
免费版功能
免费带宽:1M
免费隧道:2条
并发连接数:50个
每月不限制流量
访问地址不强制改变
支持操作系统:windows (有界面客户端)
支持操作系统:Linux
优点
缺点
免费版只有 5M带宽
下面分享几个 多语言的WEB应用
Java 实现一个WEB登陆应用程序
以下是一个简单的Java Web登陆应用程序的示例:
1.创建一个名为 “LoginServlet” 的Servlet类,它将处理用户的登录请求并验证其凭据。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginServlet extends HttpServlet {
private final String USERNAME = "admin";
private final String PASSWORD = "password";
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username.equals(USERNAME) && password.equals(PASSWORD)) {
response.sendRedirect("success.jsp");
} else {
response.sendRedirect("error.jsp");
}
}
}
2.创建一个名为 “login.jsp” 的JSP页面,它将显示登录表单并将表单数据提交给 “LoginServlet”。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h1>Login Page</h1>
<form action="LoginServlet" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Login" /></td>
</tr>
</table>
</form>
</body>
</html>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Login Successful</title>
</head>
<body>
<h1>Login Successful</h1>
<p>Welcome <%= request.getParameter("username") %>!</p>
</body>
</html>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Login Error</title>
</head>
<body>
<h1>Login Error</h1>
<p>Invalid username or password.</p>
</body>
</html>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
现在,您可以使用任何支持Java Web的服务器(如Tomcat)来部署并运行此应用程序。 用户将能够访问 “login.jsp” 页面,输入其凭据并尝试登录。如果凭据有效,他们将被重定向到 “success.jsp” 页面;否则,他们将被重定向到 “error.jsp” 页面。
package main
import (
"crypto/sha256"
"encoding/hex"
"html/template"
"net/http"
)
type User struct {
Username string
Password string
}
var users = []User{
{"user1", hashPassword("password1")},
{"user2", hashPassword("password2")},
}
func main() {
http.HandleFunc("/", handleIndex)
http.HandleFunc("/login", handleLogin)
http.ListenAndServe(":8080", nil)
}
func handleIndex(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("index.html")
t.Execute(w, nil)
}
func handleLogin(w http.ResponseWriter, r *http.Request) {
username := r.FormValue("username")
password := r.FormValue("password")
for _, user := range users {
if user.Username == username && user.Password == hashPassword(password) {
setSession(w, username)
http.Redirect(w, r, "/dashboard", http.StatusSeeOther)
return
}
}
http.Redirect(w, r, "/", http.StatusSeeOther)
}
func hashPassword(password string) string {
hasher := sha256.New()
hasher.Write([]byte(password))
return hex.EncodeToString(hasher.Sum(nil))
}
func setSession(w http.ResponseWriter, username string) {
session, _ := store.Get(r, "session-name")
session.Values["username"] = username
session.Save(r, w)
}
在上述示例中,我们首先定义了一个 User 类型,用于保存用户的用户名和密码。然后我们创建了一个 users 变量,用于保存所有注册的用户。
在 main 函数中,我们使用 http.HandleFunc 函数将请求路由到相应的处理函数。在 handleIndex 函数中,我们将 index.html 文件解析为模板,并将其发送给客户端。
在 handleLogin 函数中,我们首先获取用户输入的用户名和密码,然后遍历 users 数组来查找匹配的用户。如果找到了匹配的用户,我们使用 setSession 函数将用户信息保存到 session 中,并将用户重定向到
from flask import Flask, render_template, request, redirect, session
import hashlib
app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
users = {
'user1': hashlib.sha256(b'password1').hexdigest(),
'user2': hashlib.sha256(b'password2').hexdigest()
}
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods=['POST'])
def login():
username = request.form['username']
password = request.form['password']
if username in users and users[username] == hashlib.sha256(password.encode('utf-8')).hexdigest():
session['username'] = username
return redirect('/dashboard')
else:
return redirect('/')
@app.route('/dashboard')
def dashboard():
if 'username' in session:
return render_template('dashboard.html', username=session['username'])
else:
return redirect('/')
if __name__ == '__main__':
app.run()
在上述示例中,我们首先使用 Flask 创建了一个应用程序对象,并设置了一个密钥,用于保护 session 数据的安全。然后我们创建了一个 users 字典,用于保存所有注册的用户。
在 index 函数中,我们返回一个包含登录表单的 HTML 页面。
在 login 函数中,我们首先获取用户输入的用户名和密码,然后使用 hashlib 模块中的 sha256 函数对密码进行哈希处理,将其转换为十六进制字符串并与保存的哈希值进行比较。如果密码匹配,我们使用 session 对象保存用户的用户名,并将用户重定向到仪表盘页面。否则,我们将用户重定向回登录页面。
在 dashboard 函数中,我们检查用户是否已登录。如果是,则返回一个包含用户名称的 HTML 页面。否则,我们将用户重定向回登录页面。