shiro启动之后页面访问不了_java:shiro入门——4

【7】测试

【7.1】启动

b66b0a552d5c3054b7857e8c07c4fc27.png
a344239742198836a98dd134b3cdd94c.png
f14ffaf5d6e4418700642f84512ae121.png

点击apply然后点击OK

69175890dfb25ebc5a5c07d7337d92c6.png

【7.2】登录过滤

访问http://localhost:8080/platform/home的时候,会被

9ee7024a069ee75f00d8c1eb0be88b6e.png
37c53091afb052566193b969b6b30f63.png

【7.3】角色过滤

使用“admin”用户登录,密码:123

10e58f965b6d954165df755e48c92d1f.png

根据SecurityServiceImpl我们可以知道使用admin账号

2cc8cb0487df11eff144073ddafb86a6.png

登录成功之后:

c751bb6875dcce816c82af1a5c3cd4cb.png

此时点击“列表”,因为当前admin用户是有admin角色

c3ce5a0df45a1f143085163f7fa53dab.png

所有可以正常访问

88fab928c1a0679df2dd300bb9ecbac5.png

点击“添加”,因为当前admin用户是没有order:add的资源

1fc6e1507cc578b4d14d4d27884eaae0.png

所以回401

ae0c7872020698cdf2dfbfb80ee0ecf7.png

【7.4】资源过滤

点击“退出”

98e17d643073c317c9779b2e631a97cf.png

使用“jay”用户登录,密码为123

471f2624ed518d309b62abbdc73659bc.png

点击“添加”

ddb00c5a0cbb763dc3b98554ac3f67bc.png

因为SecurityServiceImpl中为jay用户添加如下的资源

32b1790df60d9ff109541e8636958e3c.png

点击“添加”之后正常访问

90aa88ca8ca2d537193d6154cb1b1311.png

点击“列表”之后,因为“jay”用户满意“admin”角色,所以访问受限

8a42cec3f3dc5112327e7cb143ca2ef6.png

4、web项目授权

前面我们学习了基于ini文件配置方式来完成授权,下面我们来看下其他2种方式的授权

【1】基于代码

【1.1】登录相关

73d69699978d98b4ad8e076b18950511.png

【1.2】角色相关

440341d9db0f724601a54be222027aaa.png

【1.3】资源相关

58489d541eb668802daff494c2a363b9.png

【1.4】案例

【1.4.1】创建项目

拷贝shiro-day01-07web新建shiro-day01-08web-java

9f7529bab795a4c6c83465faebceff3f.png

【1.4.2】修改shiro.ini

#声明自定义的realm,且为安全管理器指定realms[main]definitionRealm=com.itheima.shiro.realm.DefinitionRealmsecurityManager.realms=$definitionRealm#用户退出后跳转指定JSP页面logout.redirectUrl=/login.jsp#若没有登录,则被authc过滤器重定向到login.jsp页面authc.loginUrl = /login.jsp[urls]/login=anon#发送/home请求需要先登录#/home= authc#发送/order/list请求需要先登录#/order-list = roles[admin]#提交代码需要order:add权限#/order-add = perms["order:add"]#更新代码需要order:del权限#/order-del = perms["order:del"]#发送退出请求则用退出过滤器/logout = logout

【1.4.3】登录相关

修改HomeServlet的doPost方法

package com.itheima.shiro.web;import org.apache.shiro.SecurityUtils;import org.apache.shiro.subject.Subject;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @Description:系统home页面 */@WebServlet(urlPatterns = "/home")public class HomeServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        doPost(req, resp);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        //通过subjectd对象去判断是否登录        Subject subject = SecurityUtils.getSubject();        boolean flag  = subject.isAuthenticated();        if (flag){            resp.sendRedirect("home.jsp");        }else {            req.getRequestDispatcher("/login").forward(req, resp);        }    }}

访问http://localhost:8080/platform/home 进行debug

53ecb54fb85f62ea4e27ea0c2b6d6af9.png

此时我们通过subject.isAuthenticated()判断是否登录,如果登录则重定向到home.jsp,如果没有登录则转发到/login对应的servlet

【1.4.4】角色相关

修改OrderListServlet的doPost方法,判断是否有admin角色,如果有则转发order-list.jsp,没有则转发/login

package com.itheima.shiro.web;import org.apache.shiro.SecurityUtils;import org.apache.shiro.subject.Subject;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @Description:订单列表 */@WebServlet(urlPatterns = "/order-list")public class OrderListServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        doPost(req, resp);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        Subject subject = SecurityUtils.getSubject();        //判断当前角色        boolean flag = subject.hasRole("admin");        if (flag){            req.getRequestDispatcher("order-list.jsp").forward(req, resp);        }else {            req.getRequestDispatcher("/login").forward(req, resp);        }    }}

访问http://localhost:8080/platform/order-list

6bce37e2dd6823151ff410ddbfc7729c.png

因为此时我未登录,也就是说当前没有admin角色,这是通过subject.hasRole("admin")返回未false

【1.4.5】资源相关

修改OrderAddServlet

package com.itheima.shiro.web;import org.apache.shiro.SecurityUtils;import org.apache.shiro.subject.Subject;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @Description:添加页码 */@WebServlet(urlPatterns = "/order-add")public class OrderAddServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        doPost(req, resp);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        Subject subject = SecurityUtils.getSubject();        //判断是否有对应资源        boolean flag = subject.isPermitted("order:add");        if (flag){            req.getRequestDispatcher("order-add.jsp").forward(req, resp);        }else {            req.getRequestDispatcher("/login").forward(req, resp);        }    }}

访问http://localhost:8080/platform/order-add

e3397014b85149ddb4cbcc2f53833218.png

因为此时我未登录,也就是说当前没有order:add资源,通过 subject.isPermitted("order:add")返回未false

【2】基于Jsp标签

【2.1】使用方式

Shiro提供了一套JSP标签库来实现页面级的授权控制, 在使用Shiro标签库前,首先需要在JSP引入shiro标签:

【2.2】相关标签

8c41a5c8bae439654d25a5d6e25616bd.png

【2.3】案例

【2.3.1】新建项目

拷贝shiro-day01-08web-java新建shiro-day01-09web-jsp-taglib项目

0c07840ffd53d02ff392e42b758e2578.png

【2.3.2】修改home.jsp

    
退出 列表 添加

【2.3.3】测试

访问http://localhost:8080/platform/login

使用admin/123登录

214a1c54a80536704bf5ecbb71d9a3a2.png

这个时候我们只能看见“列表”,看不见“添加”,点击“退出”

使用jay/123登录

be9a5346995ce9e5332fab9e2a67c8a6.png

这个时候我们只能看见“添加”,看不见“列表”,点击“退出”

需要注意的是,这里只是页面是否显示内容,不能防止盗链的发生

第五章 Springboot集成Shiro

1、技术栈

主框架:springboot

响应层:springMVC

持久层:mybatis

事务控制:jta

前端技术:easyui

2、数据库设计

【1】数据库图解

d47b3b894ac3a6ad076e875ec3065f6d.png

sh_user:用户表,一个用户可以有多个角色

sh_role:角色表,一个角色可以有多个资源

sh_resource:资源表

sh_user_role:用户角色中间表

sh_role_resource:角色资源中间表

【2】数据库脚本

sh_user

CREATE TABLE `sh_user` (  `ID` varchar(36) NOT NULL COMMENT '主键',  `LOGIN_NAME` varchar(36) DEFAULT NULL COMMENT '登录名称',  `REAL_NAME` varchar(36) DEFAULT NULL COMMENT '真实姓名',  `NICK_NAME` varchar(36) DEFAULT NULL COMMENT '昵称',  `PASS_WORD` varchar(150) DEFAULT NULL COMMENT '密码',  `SALT` varchar(36) DEFAULT NULL COMMENT '加密因子',  `SEX` int(11) DEFAULT NULL COMMENT '性别',  `ZIPCODE` varchar(36) DEFAULT NULL COMMENT '邮箱',  `ADDRESS` varchar(36) DEFAULT NULL COMMENT '地址',  `TEL` varchar(36) DEFAULT NULL COMMENT '固定电话',  `MOBIL` varchar(36) DEFAULT NULL COMMENT '电话',  `EMAIL` varchar(36) DEFAULT NULL COMMENT '邮箱',  `DUTIES` varchar(36) DEFAULT NULL COMMENT '职务',  `SORT_NO` int(11) DEFAULT NULL COMMENT '排序',  `ENABLE_FLAG` varchar(18) DEFAULT NULL COMMENT '是否有效',  PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户表';

sh_role

CREATE TABLE `sh_role` (  `ID` varchar(36) NOT NULL COMMENT '主键',  `ROLE_NAME` varchar(36) DEFAULT NULL COMMENT '角色名称',  `LABEL` varchar(36) DEFAULT NULL COMMENT '角色标识',  `DESCRIPTION` varchar(200) DEFAULT NULL COMMENT '角色描述',  `SORT_NO` int(36) DEFAULT NULL COMMENT '排序',  `ENABLE_FLAG` varchar(18) DEFAULT NULL COMMENT '是否有效',  PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户角色表';

sh_resource

CREATE TABLE `sh_resource` (  `ID` varchar(36) NOT NULL COMMENT '主键',  `PARENT_ID` varchar(36) DEFAULT NULL COMMENT '父资源',  `RESOURCE_NAME` varchar(36) DEFAULT NULL COMMENT '资源名称',  `REQUEST_PATH` varchar(200) DEFAULT NULL COMMENT '资源路径',  `LABEL` varchar(200) DEFAULT NULL COMMENT '资源标签',  `ICON` varchar(20) DEFAULT NULL COMMENT '图标',  `IS_LEAF` varchar(18) DEFAULT NULL COMMENT '是否叶子节点',  `RESOURCE_TYPE` varchar(36) DEFAULT NULL COMMENT '资源类型',  `SORT_NO` int(11) DEFAULT NULL COMMENT '排序',  `DESCRIPTION` varchar(200) DEFAULT NULL COMMENT '描述',  `SYSTEM_CODE` varchar(36) DEFAULT NULL COMMENT '系统code',  `IS_SYSTEM_ROOT` varchar(18) DEFAULT NULL COMMENT '是否根节点',  `ENABLE_FLAG` varchar(18) DEFAULT NULL COMMENT '是否有效',  PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='资源表';

sh_role_resource

CREATE TABLE `sh_role_resource` (  `ID` varchar(36) NOT NULL,  `ENABLE_FLAG` varchar(18) DEFAULT NULL,  `ROLE_ID` varchar(36) DEFAULT NULL,  `RESOURCE_ID` varchar(36) DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='角色资源表';

sh_user_role

CREATE TABLE `sh_user_role` (  `ID` varchar(36) NOT NULL,  `ENABLE_FLAG` varchar(18) DEFAULT NULL,  `USER_ID` varchar(36) DEFAULT NULL,  `ROLE_ID` varchar(36) DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户角色表';

3、项目骨架

c116b4a7d0d7856bb91b9f76726ff3a9.png

4、ShiroDbRealm定义

【1】图解

c39e4012a3c3ae3ee2e0c98734703b4f.png

【2】原理分析

(1)、ShiroDbRealmImpl继承ShiroDbRealm向上继承AuthorizingRealm,ShiroDbRealmImpl实例化时会创建密码匹配器HashedCredentialsMatcher实例,HashedCredentialsMatcher指定hash次数与方式,交于AuthenticatingRealm

(2)、调用login方法后,最终调用doGetAuthenticationInfo(AuthenticationToken authcToken)方法,拿到SimpleToken的对象,调用UserBridgeService的查找用户方法,把ShiroUser对象、密码和salt交于SimpleAuthenticationInfo去认证

(3)、访问需要鉴权时,调用doGetAuthorizationInfo(PrincipalCollection principals)方法,然后调用UserBridgeService的授权验证

【3】核心类代码

【3.1】ShiroDbRealm

package com.itheima.shiro.core;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import javax.annotation.PostConstruct;/** * * @Description shiro自定义realm */public abstract class ShiroDbRealm extends AuthorizingRealm {    /**     * @Description 认证     * @param authcToken token对象     * @return      */    public abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) ;    /**     * @Description 鉴权     * @param principals 令牌     * @return     */    public abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals);    /**     * @Description 密码匹配器     */    @PostConstruct    public abstract void initCredentialsMatcher() ;}

【3.2】ShiroDbRealmImpl

package com.itheima.shiro.core.impl;import com.itheima.shiro.constant.SuperConstant;import com.itheima.shiro.core.base.ShiroUser;import com.itheima.shiro.core.base.SimpleToken;import com.itheima.shiro.core.ShiroDbRealm;import com.itheima.shiro.core.bridge.UserBridgeService;import com.itheima.shiro.pojo.User;import com.itheima.shiro.utils.BeanConv;import com.itheima.shiro.utils.DigestsUtil;import com.itheima.shiro.utils.EmptyUtil;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authc.UnknownAccountException;import org.apache.shiro.authc.credential.HashedCredentialsMatcher;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.util.ByteSource;import org.springframework.beans.factory.annotation.Autowired;/** * @Description:自定义shiro的实现 */public class ShiroDbRealmImpl extends ShiroDbRealm {    @Autowired    private UserBridgeService userBridgeService;    /**     * @Description 认证方法     * @param authcToken 校验传入令牌     * @return AuthenticationInfo     */    @Override    public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {        SimpleToken token = (SimpleToken)authcToken;        User user  = userBridgeService.findUserByLoginName(token.getUsername());        if(EmptyUtil.isNullOrEmpty(user)){            throw new UnknownAccountException("账号不存在");        }        ShiroUser shiroUser = BeanConv.toBean(user, ShiroUser.class);        shiroUser.setResourceIds(userBridgeService.findResourcesIdsList(user.getId()));        String salt = user.getSalt();        String password = user.getPassWord();        return new SimpleAuthenticationInfo(shiroUser, password, ByteSource.Util.bytes(salt), getName());    }    /**     * @Description 授权方法     * @param principals SimpleAuthenticationInfo对象第一个参数     * @return     */    @Override    public AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {        ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal();        return userBridgeService.getAuthorizationInfo(shiroUser);    }    /**     * @Description 加密方式     */    @Override    public void initCredentialsMatcher() {        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(SuperConstant.HASH_ALGORITHM);        matcher.setHashIterations(SuperConstant.HASH_INTERATIONS);        setCredentialsMatcher(matcher);    }}

【3.3】SimpleToken

package com.itheima.shiro.core.base;import org.apache.shiro.authc.UsernamePasswordToken;/** * @Description 自定义tooken */public class SimpleToken extends UsernamePasswordToken {    /** serialVersionUID */    private static final long serialVersionUID = -4849823851197352099L;    private String tokenType;    private String quickPassword;    /**     * Constructor for SimpleToken     * @param tokenType     */    public SimpleToken(String tokenType, String username,String password) {        super(username,password);        this.tokenType = tokenType;    }    public SimpleToken(String tokenType, String username,String password,String quickPassword) {        super(username,password);        this.tokenType = tokenType;        this.quickPassword = quickPassword;    }    public String getTokenType() {        return tokenType;    }    public void setTokenType(String tokenType) {        this.tokenType = tokenType;    }    public String getQuickPassword() {        return quickPassword;    }    public void setQuickPassword(String quickPassword) {        this.quickPassword = quickPassword;    }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oreo另一个意思_记一次有意思的统计(部分大宗商品价格指数相关性统计)

最近闲来无事,对部分大宗商品近十年的价格涨幅做了个统计,发现有些有意思的现象:大多资产价格走势如果放到一个足够长得时间维度里,那其实整体走势是比较一致的;有些资产价格走势高度相关,但是在某个时间段…

android左右耳机声音大小不一样,AirPods左右两边声音大小不同怎么办 单侧无声和两侧音量不同解决方法...

AirPods连接 iPhone 后如果出现了左右两边声音大小不一样,或者单侧无声的问题,可能是软件导致的暂时性故障,也有可能是硬件问题。当耳机音量出现异常时,可以通过以下几种方式尝试恢复。单侧无声和两侧音量不同解决方法&#xff1a…

laravel 任务队列_Laravel5.5之事件监听、任务调度、队列

流程:1.1 创建eventphp artisan make:event UserLoginLoginController.php/*** The user has been authenticated.** param IlluminateHttpRequest $request* param mixed $user* return mixed*/protected function authenticated(Request $request, $user){eve…

pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路

选自Medium作者:Victor Sanh机器之心编译参与:魔王过去一段时间,大模型层出不穷。在大家纷纷感叹「大力出奇迹」的时候,作为调用预训练语言模型最流行的库,HuggingFace 尝试用更少的参数量、更少的训练资源实现同等的性…

if test 多条件_秒懂Python编程中的if __name__ == #39;main#39; 作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ main:1 这段代码的功能一个python的文件有两种使用的方法:第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ main: 的作用就是控制这两种情…

python背景颜色怎么随机_Python中的随机颜色

我同意TigerhawkT3(1)你教授对pick_color()的实现是垃圾。但我不认为random.choice(),或者你教授滥用random.shuffle()的方式是最好的选择。两者的问题是,在连续调用时可以获得相同的颜色,这是在正方形内绘制正方形时不…

python 解决手机拍的书籍图片发灰的问题

老师给发的作业经常是手机拍的,而不是扫描,背景发灰,如果二次打印就没有看了,象这样: 如果使用photoshop 处理,有些地方还是扣不干净,不如python 做的好,处理后如下: 具体…

2016年cypher资源_2021-2027年中国鱿鱼行业市场供需规模及未来前景分析报告

报告类型:产业研究报告格式:电子版、纸介版、电子纸介出品单位:智研咨询官网链接:中国产业信息网 - 产业前景投资趋势门户-智研旗下产业信息咨询平台​www.chyxx.com报告链接:2021-2027年中国鱿鱼行业市场供需规模及未…

地面控制点的定义与作用_什么是地面塌陷

地面塌陷2020年1月13日,青海西宁市城中区一公交车站附近地面突然塌陷,一辆搭载乘客的公交车掉入坑中,致使9人遇难。2019年12月12日,厦门吕厝路口地铁1号线和2号线外的配套物业开发项目施工现场发生约500平方米地面塌陷&#xff0c…

animate动画案例_animate动画案例——小小购物狂

如今各平台小动画层出不穷,大部分这种二维动画都是animate或者flash做的,例如下面这种效果animate既可以将各种内容做成动画。既可以设计适合游戏、电视节目和 Web 的交互式动画。让卡通和横幅广告栩栩如生。也可以用来创作动画涂鸦和头像。并向电子学习…

男孩子不上学了学计算机要学历吗,十三岁男孩不上学,能学什么手艺?

十三岁男孩不上学,能学什么手艺?十三岁时的孩子,有些学校要求我们先上过义务教育再去学习,有些学校是允许十三岁就直接接受教育的,有些学校是对十三岁还在上半学的学生进行补习一下的。那么,十三岁男孩不上学,可以学什么手艺?其实,有很多孩子对自己在学校学习时未能掌握的知识…

numpy 拼接_数据分析-numpy的拼接与交换

1.数组的拼接import numpy as npt1np.arange(24).reshape((4,6))t2np.arange(100,124).reshape((4,6))print(t1)print("*"*50)print(t2)print("*"*50)#竖直拼接t3np.vstack((t1,t2))print(t3)print("*"*50)#水平拼接t4np.hstack((t1,t2))print(t…

iptables 指定网卡_LINUX系统下的IPTABLES防火墙系统讲解(二)实战操作

iptables数据流方向iptables操作命令:#iptables --helpUsage: iptables -[AD] chain rule-specification [options]iptables -[RI] chain rulenum rule-specification [options]iptables -D chain rulenum [options]iptables -[LFZ] [chain] [options]iptables -[NX] chainipta…

java接口文档生成工具_接口文档生成

一、为什么要写接口文档?1.正规的团队合作或者是项目对接,接口文档是非常重要的,一般接口文档都是通过开发人员写的。一个工整的文档显得是非重要。2.项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发,项目维护中或者…

联想计算机如何设置用户名和密码忘了,联想(Lenovo)路由器无线wifi密码忘记了怎么办啊?...

联想(Lenovo)路由器无线wifi密码忘记了怎么办?忘记wifi密码这个问题,很多用户都会遇到。因为手机、笔记本、平板电脑在首次连接wifi信号后,会自动保存该wifi信号密码,以后会自动进行连接,无需用户手动输入wifi密码&…

mysql binlog查看_MySQL--17 配置binlog-server 及中间件

配置binlog-server修改mha配置文件[rootmysql-db03 ~]# vim /etc/mha/app1.cnf[binlog1]no_master1hostname10.0.0.53master_binlog_dir/data/mysql/binlog/备份binlog#创建备份binlog目录[rootmysql-db03 ~]# mkdir -p /data/mysql/binlog/#进入该目录[rootmysql-db03 ~]# cd …

桥梁在线计算机监测系统,桥梁在线监测系统

原标题:桥梁在线监测系统监测背景我国是个桥梁大国,据最新数据统计,我国超过100万座公路桥梁(不含市政桥梁)。影响桥梁的因素居多,人为因素、车辆长期超载、材料自身退化等,缺乏及时到位的管理养护导致结构各部分在远没…

idea黑色好还是白色好_白色牛仔裤,好看又好搭

白色是属于夏天的颜色,也是最纯洁、最惹人注目的颜色。无论时尚如何轮回迭代,白色给我们的代名词永远是优雅、高贵、纯洁、干净、高贵、永恒等这些美好的词汇。白色是时光、流动、轻巧的颜色,它代表着东方的安静和中庸,也是留白含…

c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)

这节讲一下,什么是面向对象(Object Oriented Programming)。说面向对象之前,我们不得不提的是面向过程(Process Oriented Programming),C语言就是面向过程的语言,这两者的区别在哪呢?我们可以设想一个情景——厨房做菜…

linux数据泵导入command not found_MySQL:数据库结构优化、高可用架构设计、数据库索引优化...

一、SQL查询优化(重要)1.1 获取有性能问题SQL的三种方式通过用户反馈获取存在性能问题的SQL;通过慢查日志获取存在性能问题的SQL;实时获取存在性能问题的SQL;1.1.2 慢查日志分析工具相关配置参数:slow_query_log # 启动停止记录慢…