baseHandler实现字段加密存储
时间: 2024-02-02 19:05:13 浏览: 15
如果你想在 MyBatis 的 BaseHandler 中实现字段加密存储,你可以按照以下步骤进行操作:
1. 创建一个自定义的 BaseHandler 类,继承自 MyBatis 的 BaseStatementHandler 类。这个类将作为你的拦截器的核心逻辑。
2. 在自定义的 BaseHandler 类中,重写 `prepare` 方法。这个方法会在 SQL 语句执行之前被调用,你可以在这里进行字段加密的操作。
3. 在 `prepare` 方法中,通过获取 MappedStatement 对象,可以获取到当前 SQL 语句的信息。你可以在这里判断当前 SQL 语句是否需要进行字段加密的处理。
4. 如果需要进行字段加密处理,你可以通过获取 BoundSql 对象来获取 SQL 语句中的参数和字段值。然后使用加密算法对字段值进行加密,并将加密后的值替换原来的字段值。
5. 最后,你需要在自定义的 BaseHandler 类中实现两个必要的方法:`plugin` 和 `setProperties`。在 `plugin` 方法中,你可以使用 MyBatis 提供的 Plugin 类来包装你的拦截器;在 `setProperties` 方法中,你可以读取和设置插件的属性。
6. 在 MyBatis 配置文件中,将你的自定义拦截器添加到 `<plugins>` 标签内,以启用插件。
请注意,在实现字段加密存储时,确保数据的安全性和性能。同时,还要注意加密和解密的过程,以及密钥的管理和保护。
相关问题
帮我实现一个美观的对称的中文html登陆页面代码,支持session验证,后端是tornado
好的,我可以为您提供一个美观的对称的中文html登陆页面代码,支持session验证,后端是tornado。以下是代码示例:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<style>
body {
background-color: #f2f2f2;
font-family: Arial, sans-serif;
}
.container {
margin: 0 auto;
width: 400px;
padding: 20px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0,0,0,0.3);
}
h1 {
text-align: center;
font-size: 28px;
margin-bottom: 20px;
}
label {
display: block;
font-size: 16px;
margin-bottom: 10px;
}
input[type="text"], input[type="password"] {
width: 100%;
padding: 10px;
font-size: 16px;
border-radius: 5px;
border: 1px solid #ccc;
margin-bottom: 20px;
box-sizing: border-box;
}
input[type="submit"] {
background-color: #4CAF50;
color: #fff;
border: none;
padding: 10px 20px;
font-size: 16px;
border-radius: 5px;
cursor: pointer;
}
input[type="submit"]:hover {
background-color: #3e8e41;
}
.error {
color: red;
font-size: 14px;
margin-top: 10px;
}
</style>
</head>
<body>
<div class="container">
<h1>登录</h1>
<form action="/login" method="post">
<label for="username">用户名</label>
<input type="text" id="username" name="username" required>
<label for="password">密码</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="登录">
<div class="error">{{ error }}</div>
</form>
</div>
</body>
</html>
```
在后端使用Tornado框架,可以使用以下代码实现session验证:
```python
import tornado.web
import tornado.ioloop
import tornado.escape
import uuid
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
user_json = self.get_secure_cookie("user")
if not user_json:
return None
return tornado.escape.json_decode(user_json)
class LoginHandler(BaseHandler):
def get(self):
self.render("login.html", error=None)
def post(self):
username = self.get_argument("username")
password = self.get_argument("password")
if username == "admin" and password == "123456":
self.set_secure_cookie("user", tornado.escape.json_encode({"username": username}))
self.redirect("/")
else:
error = "用户名或密码错误"
self.render("login.html", error=error)
class LogoutHandler(BaseHandler):
def get(self):
self.clear_cookie("user")
self.redirect("/login")
class MainHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.write("欢迎 %s 登录" % self.current_user["username"])
if __name__ == "__main__":
settings = {
"cookie_secret": str(uuid.uuid4()),
"login_url": "/login",
"template_path": "templates",
"static_path": "static",
"xsrf_cookies": True,
"debug": True,
}
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler),
(r"/logout", LogoutHandler),
], **settings)
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
```
以上代码实现了一个简单的登录页面,支持session验证,后端使用Tornado框架。当用户输入正确的用户名和密码后,会设置一个名为“user”的cookie,保存用户信息。在MainHandler中,使用了tornado.web.authenticated装饰器,表示只有登录用户才能访问该页面。如果用户未登录,则会自动跳转到登录页面。在LogoutHandler中,清除了名为“user”的cookie,实现了退出登录的功能。
帮我实现一套完整的html登陆,跳转页面及登出,支持token保存和验证,后端是tornado,给出代码
前端代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script>
$(document).ready(function() {
$("#login-form").submit(function(event) {
event.preventDefault();
var username = $("#username").val();
var password = $("#password").val();
$.ajax({
url: "/login",
type: "POST",
data: JSON.stringify({username: username, password: password}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
if (data.success) {
window.location.href = "/home";
} else {
alert(data.message);
}
},
error: function(xhr, status, error) {
alert("Error: " + error);
}
});
});
$("#logout").click(function(event) {
event.preventDefault();
$.ajax({
url: "/logout",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
if (data.success) {
window.location.href = "/";
} else {
alert(data.message);
}
},
error: function(xhr, status, error) {
alert("Error: " + error);
}
});
});
});
</script>
</head>
<body>
<div class="container">
<h2>Login</h2>
<form id="login-form">
<div class="form-group">
<label for="username">Username:</label>
<input type="text" class="form-control" id="username" placeholder="Enter username">
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" class="form-control" id="password" placeholder="Enter password">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<br>
<button id="logout" class="btn btn-default">Logout</button>
</div>
</body>
</html>
```
后端代码:
```python
import tornado.ioloop
import tornado.web
import json
import uuid
# In-memory database
users = {
"admin": "admin",
"user1": "password1",
"user2": "password2"
}
# In-memory token database
tokens = {}
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
token = self.get_secure_cookie("token")
if token:
return tokens.get(token.decode("utf-8"))
class LoginHandler(BaseHandler):
def get(self):
self.render("login.html")
def post(self):
data = json.loads(self.request.body.decode("utf-8"))
username = data["username"]
password = data["password"]
if username in users and users[username] == password:
token = str(uuid.uuid4())
tokens[token] = username
self.set_secure_cookie("token", token)
self.write(json.dumps({"success": True}))
else:
self.write(json.dumps({"success": False, "message": "Invalid username or password"}))
class HomeHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.render("home.html")
class LogoutHandler(BaseHandler):
def post(self):
token = self.get_secure_cookie("token")
if token:
del tokens[token.decode("utf-8")]
self.clear_cookie("token")
self.write(json.dumps({"success": True}))
else:
self.write(json.dumps({"success": False, "message": "Not logged in"}))
def make_app():
return tornado.web.Application([
(r"/", LoginHandler),
(r"/home", HomeHandler),
(r"/logout", LogoutHandler),
], cookie_secret="mysecret")
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
```
在这个例子中,我们使用了一个基于内存的数据库来存储用户信息和token信息。在实际应用中,我们应该使用一个真正的数据库来存储这些信息。此外,我们还使用了Tornado的安全cookie来存储token信息,以便在不同的请求之间共享。