有时候,我们在某些界面执行操作一些操作后,不希望界面跳转到其他指定网页上,而希望网页能重定向为用户刚才浏览的界面,以便继续完成操作,例如在某个页面需要登录后才能进行操作,我们希望登录后不跳转到主页界面,而是重定向为刚才操作的页面,从而能够方便的继续刚才未完成的操作。
return redirect(request.referrer)
# 为了防止用户出于隐私保护设置清除了或修改了该字段,添加备用选项
return redirect(request.referrer or url_for('index'))
@app.route('/index')
def index():
return '<a href="%s">登陆</a>' % url_for("login", next=request.full_path)
@app.route("/login")
def login():
执行登陆操作......
return rediect(request.args.get("next"))
# 添加备选项
return rediect(request.args.get("next"), url_for("index")))
通用重定向函数,避免重复代码
def redirect_back(default="hello", **kwargs):
for target in request.args.get('next'), request.referrer:
if target:
return redirect(target)
return redirect(url_for(default, **kwargs))
@app.route("/login")
def login:
return redirect_back()
由于referer和next容易被篡改的特性,如果不对这些值进行验证,则会形成开放重定向漏洞。
URL验证函数
for urllib.parse import urlparse, urljoin
from flask import request
def is_safe_url(target):
ref_url = urlparse(request.host_url)
test_url = ulparse(urljoin(request.host_url, target))
return test_url.scheme in ("http", "https") and ref_ul.netloc == test_url.netloc
# 在重定向通用代码中使用
def redirect_back(default="hello", **kwargs):
for target in request.args.get('next'), request.referrer:
if not target:
continue
if is_safe_ul(target):
return redirect(target)
return redirect(url_for(default, **kwargs))
这段代码定义了一个名为 is_safe_url() 的函数,用于判断给定的 URL 是否安全。
具体来说,is_safe_url() 函数接受一个参数 target,表示要检查的 URL。在函数体内,首先使用 urlparse() 函数从当前请求的 request.host_url 中解析出引用 URL(即当前页面的 URL),并将其赋值给 ref_url 变量。然后,使用 urljoin() 函数将 request.host_url 和 target 合并成完整的 URL,并使用 urlparse() 函数解析出测试 URL,并将其赋值给 test_url 变量。
最后,函数会判断 test_url 是否安全。具体来说,它会检查 test_url 的协议是否为 “http” 或 “https”,并且检查 test_url 的域名与 ref_url 的域名是否相同。如果这两个条件都满足,那么 is_safe_url() 函数将返回 True,表示 URL 是安全的;否则,返回 False,表示 URL 不安全。
Ajax(Asynchronous JavaScript and XML)是一种在网页中使用的技术,通过在后台与服务器进行异步通信,实现页面内容的局部更新,而无需刷新整个页面。
传统的网页交互是同步的,即用户发起请求后,需要等待服务器返回完整的页面并刷新整个页面才能看到结果。而使用 Ajax 技术,可以在不刷新整个页面的情况下,通过发送异步请求,获取服务器返回的数据,并使用 JavaScript 动态更新页面的部分内容。
Ajax 基于以下几个核心的技术:
Ajax 技术它可以用于实现实时搜索、动态加载内容、表单验证、无刷新提交等功能。
并不一定需要使用jQuery来实现Ajax请求,可以使用原生的XMLHttpRequest,其它JavaScript框架内置的Ajax接口,或这使用更新的Fetch API来发送异步请求。
服务器推送(Server Push)是一种在客户端与服务器之间建立持久连接,并由服务器主动向客户端发送数据的通信方式。它与传统的客户端发起请求、服务器响应的模式不同,可以实现实时更新数据或推送通知给客户端,而无需客户端主动请求。
常见实现方式和协议:
名称 | 说明 |
---|---|
传统轮询 | 在特定的时间内,客户端使用Ajax技术不断向服务器发起HTTP请求,然后获取的新的数据并更新页面。 |
长轮询 | 和传统相比,如果服务器一直没有返回数据,那就保持连接一直开启,直到有数据时才返回,取回数据后再次发送另一个请求。 |
Server-Sent Events(SSE) | SSE 是一种基于 HTTP 的服务器推送技术。通过 SSE,服务器可以使用单向的持久连接向客户端发送数据。客户端通过 EventSource API 接收服务器发送的事件流,实现实时更新数据或接收通知。 |
WebSocket | WebSocket 是一种支持全双工通信的网络协议,它提供了双向的持久连接,使得服务器可以主动向客户端发送数据。通过 WebSocket,服务器可以实时地将更新的数据或通知推送给客户端,而客户端也可以向服务器发送消息。 |
重点注意SQL注入攻击