帮我实现一套完整的html登陆及登出页面,支持token保存和验证,后端是tornado,给出代码
时间: 2023-05-18 12:05:44 浏览: 233
前端代码:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<h1>Login Page</h1>
<form id="login-form">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<button type="submit">Login</button>
</form>
<br>
<button id="logout-btn" style="display:none">Logout</button>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
// Check if token exists
var token = localStorage.getItem('token');
if (token) {
$('#login-form').hide();
$('#logout-btn').show();
}
// Login form submit
$('#login-form').submit(function(e) {
e.preventDefault();
var username = $('#username').val();
var password = $('#password').val();
$.ajax({
url: '/login',
type: 'POST',
data: {username: username, password: password},
success: function(data) {
localStorage.setItem('token', data.token);
$('#login-form').hide();
$('#logout-btn').show();
},
error: function() {
alert('Invalid username or password');
}
});
});
// Logout button click
$('#logout-btn').click(function() {
localStorage.removeItem('token');
$('#login-form').show();
$('#logout-btn').hide();
});
});
</script>
</body>
</html>
```
后端代码:
```python
import tornado.ioloop
import tornado.web
import jwt
# Secret key for JWT
SECRET_KEY = 'mysecretkey'
# User database
users = {
'admin': 'password',
'user1': 'password1',
'user2': 'password2'
}
# Login handler
class LoginHandler(tornado.web.RequestHandler):
def post(self):
username = self.get_argument('username')
password = self.get_argument('password')
if username in users and users[username] == password:
# Generate JWT token
token = jwt.encode({'username': username}, SECRET_KEY, algorithm='HS256')
self.write({'token': token})
else:
self.set_status(401)
# Logout handler
class LogoutHandler(tornado.web.RequestHandler):
def get(self):
self.clear_cookie('token')
self.redirect('/')
# Protected handler
class ProtectedHandler(tornado.web.RequestHandler):
def get(self):
token = self.get_cookie('token')
if token:
try:
# Verify JWT token
decoded = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
self.write('Welcome, ' + decoded['username'])
except jwt.exceptions.DecodeError:
self.set_status(401)
else:
self.set_status(401)
# Application settings
settings = {
'cookie_secret': 'mycookiesecret',
'login_url': '/login',
'xsrf_cookies': True
}
# Application routes
application = tornado.web.Application([
(r'/', ProtectedHandler),
(r'/login', LoginHandler),
(r'/logout', LogoutHandler)
], **settings)
if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
```
说明:
1. 前端页面包含一个登录表单和一个注销按钮,使用jQuery实现表单提交和按钮点击事件。
2. 登录表单提交时,使用jQuery的ajax方法向后端发送POST请求,传递用户名和密码,后端验证成功后生成JWT token并返回给前端,前端将token保存在localStorage中。
3. 注销按钮点击时,前端从localStorage中删除token,并显示登录表单。
4. 后端使用tornado框架实现了三个路由:登录、注销和受保护的页面。
5. 登录路由接收前端POST请求,验证用户名和密码,验证成功后生成JWT token并返回给前端。
6. 注销路由清除浏览器cookie并重定向到首页。
7. 受保护的页面路由接收前端GET请求,验证浏览器cookie中的JWT token,验证成功后返回欢迎信息,否则返回401状态码。
阅读全文