目录

1.首页页面也要检测用户是否登录

2.在flask中使用MongoDB

3.用户页面更新用户信息

4.交易密码界面/密码修改界面/昵称修改界面初始化

5.交易密码实现

1.首页页面也要检测用户是否登录

1.在index.html中添加check_user_login方法

在index.html页面中调用checkout函数,如果回调函数传来1005状态码,则删除对应token,让用户重新进行登录

html/index.html,代码;

created(){
this.check_user_login();
},
methods:{
// 首页检测用户是否登录
check_user_login(){
let token = this.game.get("access_token") || this.game.fget("access_token");
this.game.checkout(this, token, (new_access_token)=>{
if(new_access_token.errno == 1005){
this.game.save({"access_token":""});
this.game.fremove("access_token");
}
});
},

2.修改main.js中checkout函数

当检查用户登录状态时,如果用户点击取消登录,则返回1005状态码.

class Game{
// 验证用户token是否存在或者是否失效的功能
checkout(vm, token, callback){
vm.axios.post("",{
"jsonrpc": "2.0",
"id": vm.uuid(),
"method": "User.check",
"params": {}
},{
headers:{
Authorization: "jwt " + token,
}
}).then(response=>{
if(parseInt(response.data.result.errno) === 1005){
api.actionSheet({
title: '本次登陆超时,是否更新登陆状态?',
cancelTitle: '取消登陆',
destructiveTitle: '更新登陆状态',
}, (ret, err)=>{
if( ret.buttonIndex == 1 ){
this.get_acccess_by_refresh(vm, callback);
}else{
// ********
callback({"errno":1005,"errmsg":"登陆超时!"});
}
});
}else if (parseInt(response.data.result.errno) === 1000){
callback(token);
}
return false;
}).catch(error=>{
this.print(error);
}); }
get_acccess_by_refresh(vm, callback){
var token = this.get("refresh_token") || this.fget("refresh_token");
if( !token ){
return false;
}
vm.axios.post("",{
"jsonrpc": "2.0",
"id": vm.uuid(),
"method": "User.refresh",
"params": {}
},{
headers:{
Authorization: "jwt " + token,
}
}).then(response=>{
if(response.data.result.errno===1000){
this.save({"access_token": response.data.result.access_token});
callback(response.data.result.access_token);
}
})
}

2.在flask中使用MongoDB

1.安装

pip install Flask-PyMongo

2.初始化和配置

application/__init__.py,代码:

from flask_pymongo import PyMongo

# mongoDB
mongo = PyMongo() def init_app(config_path):
"""全局初始化""" # 数据库初始化
db.init_app(app)
app.db = db
redis.init_app(app)
mongo.init_app(app) # 初始化mongo

`application/settings/dev.py`,代码:

from . import InitConfig
class Config(InitConfig):
"""项目开发环境下的配置""" # mongoDB配置信息
MONGO_URI = "mongodb://127.0.0.1:27017/mofang"

3.在用户修改个人信息[头像]时, 更新历史记录到mongodb

application/apps/users/views.py,代码:

import base64, uuid,os
from application import mongo
from datetime import datetime
@jsonrpc.method("User.avatar.update")
@jwt_required # 验证jwt
def update_avatar(avatar):
"""获取用户信息"""
# 1. 接受客户端上传的头像信息
ext = avatar[avatar.find("/")+1:avatar.find(";")] # 资源格式
b64_avatar = avatar[avatar.find(",")+1:]
b64_image = base64.b64decode(b64_avatar)
filename = uuid.uuid4()
static_path = os.path.join( current_app.BASE_DIR,current_app.config["STATIC_DIR"] )
with open("%s/%s.%s" % (static_path, filename,ext),"wb") as f:
f.write(b64_image) # 2.判断用户是否存在
current_user_id = get_jwt_identity()
user = User.query.get(current_user_id)
if user is None:
return {
"errno": status.CODE_NO_USER,
"errmsg": message.user_not_exists,
}
# 3.将用户头像存到mysql数据库中
user.avatar = "%s.%s" % (filename,ext)
db.session.commit()
# ***4.添加修改记录到MongoDB***!
document = {
"user_id": user.id,
"user_name": user.name,
"user_nikcname": user.nickname,
"updated_time": datetime.now().timestamp(), # 修改时间
"avatar": avatar, # 图片内容
"type": "avatar", # 本次操作的类型
}
mongo.db.user_info_history.insert_one(document) return {
"errno": status.CODE_OK,
"errmsg": message.avatar_save_success,
"avatar": "%s.%s" % (filename,ext)
}

3.用户页面更新用户信息

1.将nickname和avatar改为动态的

2.并且在user.html中添加之前已经写过的change_avatar函数和get_user_info函数

<!DOCTYPE html>
<html>
<head>
<title>用户中心</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" href="../static/css/main.css">
<script src="../static/js/vue.js"></script>
<script src="../static/js/axios.js"></script>
<script src="../static/js/main.js"></script>
<script src="../static/js/uuid.js"></script>
<script src="../static/js/settings.js"></script>
</head>
<body>
<div class="app user" id="app">
<div class="bg">
<img src="../static/images/bg0.jpg">
</div>
<img class="back" @click="goto_index" src="../static/images/user_back.png" alt="">
<img class="setting" @click="goto_setting" src="../static/images/setting.png" alt="">
<div class="header">
<div class="info">
<div class="avatar">
<img class="avatar_bf" src="../static/images/avatar_bf.png" alt="">
<img class="user_avatar" :src="avatar" alt="">
<img class="avatar_border" src="../static/images/avatar_border.png" alt="">
</div>
<p class="user_name">{{nickname}}</p>
</div>
<div class="wallet">
<div class="balance">
<p class="title"><img src="../static/images/money.png" alt="">钱包</p>
<p class="num">99,999.00</p>
</div>
<div class="balance">
<p class="title"><img src="../static/images/integral.png" alt="">果子</p>
<p class="num">99,999.00</p>
</div>
</div>
<div class="invite">
<img class="invite_btn" src="../static/images/invite.png" alt="">
</div>
</div>
<div class="menu">
<div class="item">
<span class="title">我的主页</span>
<span class="value">查看</span>
</div>
<div class="item">
<span class="title">任务列表</span>
<span class="value">75%</span>
</div>
<div class="item">
<span class="title">收益明细</span>
<span class="value">查看</span>
</div>
<div class="item">
<span class="title">实名认证</span>
<span class="value">未认证</span>
</div>
<div class="item">
<span class="title">问题反馈</span>
<span class="value">去反馈</span>
</div>
</ul>
</div>
</div>
<script>
apiready = function(){
init();
new Vue({
el:"#app",
data(){
return {
nickname:"",
avatar:"",
prev:{name:"",url:"",params:{}},
current:{name:"user",url:"user.html",params:{}},
}
},
created(){
this.get_user_info();
this.change_avatar();
},
methods:{
change_avatar(){
api.addEventListener({
name: 'change_avatar'
}, (ret, err)=>{
if( ret ){
var token = this.game.get("access_token") || this.game.fget("access_token");
this.avatar = `${this.settings.avatar_url}?sign=${ret.value.avatar}&token=${token}`;
}
});
},
get_user_info(){
var token = this.game.get("access_token") || this.game.fget("access_token");
// 获取当前登陆用户基本信息
this.axios.post("",{
"jsonrpc": "2.0",
"id": this.uuid(),
"method": "User.info",
"params": {}
},{
headers:{
Authorization: "jwt " + token,
}
}).then(response=>{
var res = response.data.result;
this.game.print(res);
if(parseInt(res.errno) === 1000){
this.nickname = res.nickname;
this.avatar = `${this.settings.avatar_url}?sign=${res.avatar}&token=${token}`;
}
})
},
goto_index(){
// 返回首页
this.game.outWin("user");
},
goto_setting(){
// 进入设置
this.game.goFrame("setting","setting.html", this.current);
}
}
});
}
</script>
</body>
</html>

用户页面更新用户信息

解决头像圆角问题

解决头像圆角问题,可以通过css修改样式. main.css,代码:

.user .info .user_avatar{
position: absolute;
z-index: 1;
width: 4.56rem;
height: 4.56rem;
margin: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
border-radius: 1rem;
}

4.交易密码界面/密码修改界面/昵称修改界面初始化

1.配置页面点击交易/密码修改/昵称,进入到相应界面

配置页面中点击交易密码/密码修改/昵称,进入相应页面。html/setting.html,代码:

<!DOCTYPE html>
<html>
<head>
<title>用户中心</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" href="../static/css/main.css">
<script src="../static/js/vue.js"></script>
<script src="../static/js/axios.js"></script>
<script src="../static/js/main.js"></script>
<script src="../static/js/uuid.js"></script>
<script src="../static/js/settings.js"></script>
</head>
<body>
<div class="app user setting" id="app">
<div class="bg">
<img src="../static/images/form_bg.png">
</div>
<img class="back" @click="goto_home" src="../static/images/user_back.png" alt="">
<div class="form">
<div class="item avatar" @click="update_avatar_frame">
<span class="title">头像</span>
<span class="goto">&gt;</span>
<span class="value">
<img :src="avatar" alt="">
</span>
</div>
<div class="item" @click="update_nickname_frame">
<span class="title">昵称</span>
<span class="goto">&gt;</span>
<span class="value">{{nickname}}</span>
</div>
<div class="item">
<span class="title">手机号</span>
<span class="goto">&gt;</span>
<span class="value">{{mobile}}</span>
</div>
<div class="item" @click="update_password_frame">
<span class="title">登陆密码</span>
<span class="value"></span>
<span class="goto">&gt;</span>
</div>
<div class="item" @click="update_transaction_password_frame">
<span class="title">交易密码</span>
<span class="value"></span>
<span class="goto">&gt;</span>
</div>
<div class="item">
<span class="title">地址管理</span>
<span class="value"></span>
<span class="goto">&gt;</span>
</div>
<div class="item">
<span class="title">设备管理</span>
<span class="value"></span>
<span class="goto">&gt;</span>
</div>
<div class="item logout">
<img @click="change_account" src="../static/images/change_account.png" alt="">
<p @click="logout">退出账号</p>
</div>
</div>
</div>
<script>
apiready = function(){
init();
new Vue({
el:"#app",
data(){
return {
nickname: "",
mobile: "",
avatar: "../static/images/avatar.png",
prev:{name:"",url:"",params:{}},
current:{name:"setting",url:"setting.html",params:{}},
}
},
created(){
this.get_user_info();
this.change_avatar();
},
methods:{
get_user_info(){
var token = this.game.get("access_token") || this.game.fget("access_token");
// 获取当前登陆用户基本信息
this.axios.post("",{
"jsonrpc": "2.0",
"id": this.uuid(),
"method": "User.info",
"params": {}
},{
headers:{
Authorization: "jwt " + token,
}
}).then(response=>{
var res = response.data.result;
this.game.print(res);
if(parseInt(res.errno) === 1000){
this.nickname = res.nickname;
this.avatar = `${this.settings.avatar_url}?sign=${res.avatar}&token=${token}`;
this.mobile = res.mobile;
}
})
},
change_avatar(){
api.addEventListener({
name: 'change_avatar'
}, (ret, err)=>{
if( ret ){
var token = this.game.get("access_token") || this.game.fget("access_token");
this.avatar = `${this.settings.avatar_url}?sign=${ret.value.avatar}&token=${token}`;
}
});
},
goto_home(){
// this.game.outFrame("setting");
this.game.goFrame("user","user.html",this.current);
},
change_account(){
// 切换账号
this.game.goFrame("login","login.html", this.current);
},
logout(){
// 退出账号
api.actionSheet({
title: '您确认要退出当前登录吗?',
cancelTitle: '取消',
destructiveTitle: '退出登录'
}, (ret, err)=>{
if( ret ){
this.game.print(ret); // 取消为2
if(ret.buttonIndex==1){
this.game.save({"access_token":"","refresh_token":""});
this.game.fremove(["access_token","refresh_token"]);
this.game.outWin("user");
}
}
});
},
update_avatar_frame(){
// 显示修改头像的页面frame
this.game.goFrame("avatar","avatar.html", this.current,null,{
type:"push", //动画类型(详见动画类型常量)
subType:"from_top", //动画子类型(详见动画子类型常量)
duration:300 //动画过渡时间,默认300毫秒
});
},
update_transaction_password_frame(){
this.game.goFrame("transaction_password","transaction_password.html", this.current,null,{
type:"push",
subType:"from_top",
duration:300
});
},
update_password_frame(){
this.game.goFrame("password","password.html", this.current,null,{
type:"push",
subType:"from_top",
duration:300
});
},
update_nickname_frame(){
this.game.goFrame("password","password.html", this.current,null,{
type:"push",
subType:"from_top",
duration:300
});
}
}
});
}
</script>
</body>
</html>

配置页面点击不同项进入不同页面

2.交易页面初始化

<!DOCTYPE html>
<html>
<head>
<title>用户中心</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" href="../static/css/main.css">
<script src="../static/js/vue.js"></script>
<script src="../static/js/axios.js"></script>
<script src="../static/js/main.js"></script>
<script src="../static/js/uuid.js"></script>
<script src="../static/js/settings.js"></script>
</head>
<body>
<div class="app frame avatar update_password" id="app">
<div class="box">
<p class="title">交易密码</p>
<img class="close" @click="close_frame" src="../static/images/close_btn1.png" alt="">
<div class="content">
<input class="password" type="text" v-model="password" placeholder="交易密码....">
<input class="password password2" type="text" v-model="password2" placeholder="确认交易密码....">
</div>
<img @click="update_password_commit" class="btn" src="../static/images/yes.png" alt="">
</div>
</div>
<script>
apiready = function(){
init();
new Vue({
el:"#app",
data(){
return {
password:"",
password2:"",
prev:{name:"",url:"",params:{}},
current:{name:"transaction_password",url:"transaction_password.html",params:{}},
}
},
methods:{
close_frame(){
this.game.outFrame("transaction_password");
},
update_password_commit(){
// 提交用户密码 }
}
});
}
</script>
</body>
</html>

交易页面transaction_password.html初始化

交易界面CSS样式

.update_nickname .nickname,
.update_password .password
{
margin: 8rem 4.4rem 4rem;
width: 19.50rem;
height: 4rem;
line-height: 4rem;
background-color: #cc9966;
outline: none;
border: 1px solid #330000;
text-align: center;
font-size: 1.5rem;
color: #ffffcc;
}
.update_password .password{
margin-top: 5.6rem;
margin-bottom: 0.4rem;
}
.update_password .password2{
margin-top: 0.4rem;
}

交易界面CSS样式

3.密码修改界面初始化

<!DOCTYPE html>
<html>
<head>
<title>用户中心</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" href="../static/css/main.css">
<script src="../static/js/vue.js"></script>
<script src="../static/js/axios.js"></script>
<script src="../static/js/main.js"></script>
<script src="../static/js/uuid.js"></script>
<script src="../static/js/settings.js"></script>
</head>
<body>
<div class="app frame avatar update_password" id="app">
<div class="box">
<p class="title">修改密码</p>
<img class="close" @click="close_frame" src="../static/images/close_btn1.png" alt="">
<div class="content">
<input class="password" type="text" v-model="password" placeholder="原密码....">
<input class="password password2" type="text" v-model="password2" placeholder="新密码....">
</div>
<img @click="update_password_commit" class="btn" src="../static/images/yes.png" alt="">
</div>
</div>
<script>
apiready = function(){
init();
new Vue({
el:"#app",
data(){
return {
password:"",
password2:"",
prev:{name:"",url:"",params:{}},
current:{name:"password",url:"password.html",params:{}},
}
},
methods:{
close_frame(){
this.game.outFrame("password");
},
update_password_commit(){
// 提交用户密码 }
}
});
}
</script>
</body>
</html>

密码修改界面password.html

4.昵称修改界面初始化

<!DOCTYPE html>
<html>
<head>
<title>用户中心</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" href="../static/css/main.css">
<script src="../static/js/vue.js"></script>
<script src="../static/js/axios.js"></script>
<script src="../static/js/main.js"></script>
<script src="../static/js/uuid.js"></script>
<script src="../static/js/settings.js"></script>
</head>
<body>
<div class="app frame avatar update_nickname" id="app">
<div class="box">
<p class="title">修改昵称</p>
<img class="close" @click="close_frame" src="../static/images/close_btn1.png" alt="">
<div class="content">
<input class="nickname" type="text" v-model="nickname" placeholder="输入昵称....">
</div>
<img @click="update_nickname_commit" class="btn" src="../static/images/yes.png" alt="">
</div>
</div>
<script>
apiready = function(){
init();
new Vue({
el:"#app",
data(){
return {
nickname:"",
prev:{name:"",url:"",params:{}},
current:{name:"nickname",url:"nickname.html",params:{}},
}
},
methods:{
close_frame(){
this.game.outFrame("nickname");
},
update_nickname_commit(){
// 提交用户昵称 }
}
});
}
</script>
</body>
</html>

昵称修改界面nickname.html初始化

5.交易密码实现

1.模型中新增交易密码字段

模型中,新增一个交易密码的字段.users.models代码:

from werkzeug.security import generate_password_hash, check_password_hash
from application.utils.models import BaseModel,db
class User(BaseModel):
"""用户基本信息""" # 新增一个交易密码的字段
_transaction_password = db.Column(db.String(255), comment="交易密码") @property
def transaction_password(self):
return self._transaction_password @transaction_password.setter
def transaction_password(self, rawpwd):
"""密码加密"""
self._transaction_password = generate_password_hash(rawpwd) def check_transaction_password(self, rawpwd):
"""验证密码"""
return check_password_hash(self.transaction_password, rawpwd)

数据迁移,命令:

python manage.py db migrate -m "add user tansaction password"
python manage.py db upgrade

2.编写交易密码后端接口

视图中编写交易密码修改的接口,users.views.,代码

@jsonrpc.method("User.transaction.password")
@jwt_required # 验证jwt
def transaction_password(password1, password2,old_password=None):
"""
交易密码的初始化和修改
1. 刚注册的用户,没有交易密码,所以此处填写的是新密码
2. 已经有了交易密码的用户,修改旧的交易密码
"""
# 1.判断两次输入密码是否一致
if password1 != password2:
return {
"errno": status.CODE_TRANSACTION_PASSWORD_ERROR,
"errmsg": message.transaction_password_not_match
}
# 2.判断用户是否存在
current_user_id = get_jwt_identity()
user = User.query.get(current_user_id)
if user is None:
return {
"errno": status.CODE_NO_USER,
"errmsg": message.user_not_exists,
} # 3.如果之前有存在交易密码,则需要验证旧密码
if user.transaction_password: # 去数据库查看用户是否有旧的交易密码
"""修改"""
# 验证旧密码
ret = user.check_transaction_password(old_password)
if ret == False: # 如果验证旧密码失败
return {
"errno": status.CODE_PASSWORD_ERROR,
"errmsg": message.transaction_password_error
} """设置交易密码"""
user.transaction_password = password1
db.session.commit()
return {
"errno": status.CODE_OK,
"errmsg": message.ok
}

3.客户端提交交易密码变更后端用户信息

<!DOCTYPE html>
<html>
<head>
<title>用户中心</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" href="../static/css/main.css">
<script src="../static/js/vue.js"></script>
<script src="../static/js/axios.js"></script>
<script src="../static/js/main.js"></script>
<script src="../static/js/uuid.js"></script>
<script src="../static/js/settings.js"></script>
</head>
<body>
<div class="app frame avatar update_password" id="app">
<div class="box">
<p class="title">交易密码</p>
<img class="close" @click="close_frame" src="../static/images/close_btn1.png" alt="">
<div class="content" v-if="is_set_password">
<input class="password" type="password" v-model="old_password" placeholder="旧交易密码....">
<input class="password password2" type="password" v-model="password1" placeholder="新交易密码....">
<input class="password password2" type="password" v-model="password2" placeholder="确认新交易密码....">
</div>
<div class="content" v-else>
<input class="password" type="password" v-model="password1" placeholder="交易密码....">
<input class="password password2" type="password" v-model="password2" placeholder="确认交易密码....">
</div>
<img @click="update_password_commit" class="btn" src="../static/images/yes.png" alt="">
</div>
</div>
<script>
apiready = function(){
init();
new Vue({
el:"#app",
data(){
return {
is_set_password: true,
old_password: "", // 旧交易密码
password1:"", // 新交易密码
password2:"", // 确认新交易密码
prev:{name:"",url:"",params:{}},
current:{name:"transaction_password",url:"transaction_password.html",params:{}},
}
},
created(){
if( this.game.fget("is_set_transaction_password") === "false"){
this.is_set_password = false;
}
},
methods:{
close_frame(){
this.game.outFrame("transaction_password");
},
update_password_commit(){
// 1.提交用户新密码
params = {
password1: this.password1,
password2: this.password2,
}
// 2.如果不是第一次设置密码,需要将旧密码也提交到后端
if(this.is_set_password){
params.old_password = this.old_password;
}
// 3.向交易密码后端接口发送请求
var token = this.game.get("access_token") || this.game.fget("access_token");
this.axios.post("",{
"jsonrpc": "2.0",
"id": this.uuid(),
"method": "User.transaction.password",
"params": params
},{
headers:{
Authorization: "jwt " + token,
}
}).then(response=>{
var res = response.data.result;
if(parseInt(res.errno) === 1000){
this.game.fsave({"is_set_transaction_password":true});
this.game.outFrame("transaction_password");
}else{
api.alert({
title: '错误!',
msg: res.errmsg,
}, function(ret, err){ }); this.game.print(res.errno);
}
}).catch(error=>{
this.game.print(error);
});
}
}
});
}
</script>
</body>
</html>

4.把交易密码更变历史记录到Mongodb中

@jsonrpc.method("User.transaction.password")
@jwt_required # 验证jwt
def transaction_password(password1, password2,old_password=None):
"""
交易密码的初始化和修改
1. 刚注册的用户,没有交易密码,所以此处填写的是新密码
2. 已经有了交易密码的用户,修改旧的交易密码
""" if password1 != password2:
return {
"errno": status.CODE_TRANSACTION_PASSWORD_ERROR,
"errmsg": message.transaction_password_not_match
} current_user_id = get_jwt_identity()
user = User.query.get(current_user_id)
if user is None:
return {
"errno": status.CODE_NO_USER,
"errmsg": message.user_not_exists,
} # 1.如果之前有存在交易密码,则需要验证旧密码
if user.transaction_password:
"""修改"""
# 验证旧密码
ret = user.check_transaction_password(old_password)
if ret == False:
return {
"errno": status.CODE_PASSWORD_ERROR,
"errmsg": message.transaction_password_error
} """设置交易密码"""
user.transaction_password = password1
db.session.commit() # ***2.添加交易密码的修改记录,为了保证安全,仅仅记录旧密码!***
if old_password:
document = {
"user_id": user.id,
"user_name": user.name,
"user_nikcname": user.nickname,
"updated_time": datetime.now().timestamp(), # 修改时间
"transaction_password": old_password, # 变更内容
"type": "transaction_password", # 本次操作的类型
}
mongo.db.user_info_history.insert_one(document) return {
"errno": status.CODE_OK,
"errmsg": message.ok
}

day108:MoFang:首页检测用户是否登录&在项目中使用MongoDB&用户页面更新用户信息&交易密码界面实现的更多相关文章

  1. 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图

    [Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料   由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...

  2. Java Web 设置默认首页 (也就是http://域名/项目名称/)访问的页面

    第一种: 默认的是index.jsp页面,放在webapp文件夹下 在web.xml配置如下 第二种: 默认的页面不是放在webapp文件夹下,而是放在web-inf下,那么此时可以用springMV ...

  3. spring登录验证拦截器和根据用户角色登录

    大家都知道spring的用户登录拦截器,确实省去了程序员不少的精力,下面说说我在项目中使用的感受. 德安微信管理后台是管理多个微信帐号的平台,登录到平台的用户有三个角色,游客和微信帐号管理员.超级管理 ...

  4. 禁止root用户远程登录

    Linux修改ssh端口22 vi /etc/ssh/ssh_config vi /etc/ssh/sshd_config 然后修改为port 8888 以root身份service sshd res ...

  5. Web---Cookie技术(显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放))

    本章博客讲解: 1.Cookie基本用法演示 2.演示Cookie的访问权限 3.演示Cookie的删除 4.利用Cookie显示用户上次登录的时间 5.利用Cookie技术显示用户最近浏览的若干个图 ...

  6. vsftpd配置虚拟用户为登录用户02

    1.安装vsftpd 安装依赖包: yum -y install pam pam-devel db4 de4-devel db4-uitls db4-tcl 新建vsftpd系统用户: #建立Vsft ...

  7. mySQL授权(让从服务器用户可以登录到主服务器)

    mySQL授权(让从服务器用户可以登录到主服务器) 1.查看用户授权表 ? 1 select user,host,password from mysql.user; 2.给用户设置密码 ? 1 2 u ...

  8. vue实现登录后跳转到之前的页面

    在开发中我们经常遇到这样的需求,需要用户直接点击一个链接进入到一个页面,用户点击后链接后会触发401拦截返回登录界面,登录后又跳转到链接的页面而不是首页,这种问题该如何去做呢? 先说一下我们需要用到的 ...

  9. (8) tomcat中管理领域、角色及用户

    srverlet Container或web应用程序本身都可以提供控制web应用程序资源的安全防护 前者称为容器管理的安全防护,或者称为应用程序管理安全防护 通过内嵌机制,tomcat提供一些安全防护 ...

随机推荐

  1. ESP8266 鼓捣记 - 从零制作一个温湿度计

    一.前言 经过上一篇文章 <ESP8266 鼓捣记 - 入门(环境搭建) >搭建好环境后,肯定不会满足于 Hello World ,想快速做一个实际有用的东西出来,我认为温湿度计就非常合适 ...

  2. Python_教程_使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...

  3. MOOC JAVA笔记

    MOOC JAVA笔记 1.基础了解 JDK是开发人员安装的,它提供了开发java程序的必须工具 JRE是普通用户安装的,它提供了java的运行环境 JVM是java虚拟机运行程序的核心 2.程序的移 ...

  4. 打乱Map key - value的对应顺序

    应用场景:对于考试试卷选择题选项的乱序对应问题,防止考生作弊,每个人的题目都是不一样的选项顺序. package com.muyuan.platform.elearning.util; import ...

  5. git 最新笔记,工作中的必会技能

    1.状态查看: git status 可以查看工作区,暂存区的状态 untracked 在暂存区没有该文件 modified 修改过 staged 使用git add 暂存过 2.添加操作: git ...

  6. overflow:scroll

    <div style="position: relative;"> <div class="container mycontent" styl ...

  7. codeforces 1426F,初学者也能做,div3的最难题

    大家好,欢迎阅读codeforces专题. 今天选择的题目是Div3比赛的最后一题,也是最难的一道题.选这道题的主要原因是帮助大家建立信心,因为有些小伙伴给我反应说之前选择的题目有些难了,觉得自己可能 ...

  8. Android系统添加key和keypad

    平台:MTK 一.添加一个按键 1.在DCT tool keypad list 文件增加新按键的选项alps\mediatek\source\dct\Keypad_YuSu.cmp中添加新键,如SMS ...

  9. 开始使用 java8 的日期工具类

    例如,现有的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,这会导致用户潜在的并发问题.而新的LocalDate.LocalDateTime.DateTi ...

  10. C# Winform TCP发消息

    服务端: 代码: using System; using System.Collections.Generic; using System.IO; using System.Net; using Sy ...