解忧杂货店-答案在牛奶箱里
故事描述 答案在牛奶箱里是第一章,主要讲述三个人在一家很老旧的杂货店里和过去时空的人互相写信对话的故事。翔太、幸平、敦也三个半夜做坏事偷车子,车子忽然报废了就躲进附近无人的老旧的杂货里等待第二天到来混进人群。他们的这杂货店的牛奶箱里突然收到一个叫月兔的姑娘的来信,他们觉得很奇怪三更半夜怎么会有人写信给杂货店呢?打开信一看,上面写着【一个叫月兔的女运动员正在全力准备奥运会的训练,和她的男朋友是同样的运动员一起准备训练,男友突然身患癌症不能训练,她想放弃训练照顾她男友,然而她男友坚决让他坚持训练带着两个人的梦想奋斗下去,她陷入了纠结和痛苦就写信息请教杂货店老板】。这时敦也从沾满灰尘的杂志中看到,这家杂货店在四十年前就是专门解决人们的烦恼的,顿时他们意识到他们收到过去时空的人的烦恼咨询。他们觉得这种事情一辈子很难碰到并且感觉倾听别人的烦恼是件很幸运的事情就抱着疑惑和好奇的心情给月兔回了信说【可以带着男朋友一起训练】。不料回信投进牛奶箱很快就有回信,月兔说【这不现实,她男朋友卧病在床而且医院旁边也没有训练场地,并希望有个像动画里的可视电话就好了】。他们就知道了在月兔那个时代没有手机不能视频聊 ...
mybatis相关报错
报错场景一 我写的是一个简单的购物商城页面,当某个用户成功登陆以后,点击某个商品的【商品】详情按钮,就会出现500错误,具体信息如下
大概意思是原因:java.sql.SQLDataException:不支持从LONG到java.sql.Timestamp的转换不支持从LONG到java.sql.Timestamp的转换;嵌套异常为java.sql.SQLDataException:不支持从LONG到java.sql.Timestamp的转换。是buy_count这个字段转换错误。
过程如下
经过一番检查发现并不是sql语句写错了,于是我把报错信息百度一下,发现而是我的GoodsCart实体类没有加无参构造,具体原因我不知道,这是第一次碰到这情况。
解决方法 可以在GoodsCart实体类里加上无参构造,或者修改SQL语句中,gc.buy_count和gc.add_date的位置,别问我为什么,我也不知道。参考帖子上说【一旦我们手动添加了带参数的构造方法,编译器就不会给我们添加默认的无参构造方法。导致mybatis无法new这个实体类。也就无法做映 ...
Tomcat源码部署运行
Tomcat简介 按我的理解Tomcat是一个容器,存储一些jsp,servlet类。同时负责客户端发送的http请求转发到servlet容器(jsp的本质就是servlet,servlet类可以理解成为controller层的Java类)。
Tomcat的安装 进入官网。如tomcat8.5.72,点击64位的window压缩包下载64-bit Windows zip。连接如下https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.72/bin/apache-tomcat-8.5.72-windows-x64.zip,然后解压即可。也可以下载源码https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.72/src/apache-tomcat-8.5.72-src.zip
Tomcat服务的启动
1.可以直接点击startup.bat。【在你的tomcat目录\bin】
2.也可以把tomcat源码下载下来,导入maven工程,配置启动类运行。
下面我使用第二种方式启动tomcat容器,我的文件结构是如图 ...
resetPwdByMsgAndEmail
任务描述通过发送短信和邮箱重置密码
场景描述 有一天领导给我布置了一个任务,要我完成一个功能“通过发送短信和邮箱重置密码”。前端页面css已经写好但是HTML代码在蓝湖上面需要我自己拼成html页面。但是发送短信、邮箱按钮失效,刷新图形验证码失效,只给我一个页面的空壳。页面分成三个阶段,
第一个是选择重置密码方式页面,
第二个是通过发送邮箱、发送短信重置密码的页面,
第三个是重置密码页面。如图所示。其中黄色的是按钮,黑色框的是填写的内容
需求分析 因为前端只给我了一个网站的空壳,大部分事情是我一个做【页面的跳转,短信、邮箱验证码的发送,密码一致性判断】,首先给上图4个页面取一个简单易懂的名字。再规定页面上每一个按钮发送的url。这样整体的流程框架就出来了。如下图
发送手机验证码按钮分析 点击“发送手机验证码”按钮页面不会跳转到下个页面。此时若发送成功这按钮会变成倒计时状态,若发送手机验证码失败就在验证码输入框下提示具体原因。要给“获取手机验证码”按钮一个点击事件onclick="sendResetPwdMsg"俩控制验 ...
13-Shiro的rememberMe
权限分类
用户访问页面分为3中级别
未认证可以访问的页面
比如登录、注册页面
“记住我”(曾登录过)访问的页面
index.html
以认证可访问的页面
转账页面等
记住密码的流程 第一次登录login.html页面时,点击“登录”会把用户的username和password存入cookie中,第二次登录login.html页面时输入username后,会调用js方法获取cookie里的密码并自动把密码填写到input标签里。
shiro的“记住我”流程 现在上述功能交给shiro的SecurityManager实现,只需要告诉shiro把UsernamePasswordToekn类型token传入SecurityManager中,就会自动检测。
流程示意图
rememberMe实现 在ShiroConfig中设置过滤器的权限,让访问index.html页面是以登录或曾登录用户的才能访问。设置过滤filterMap规则。
1filterMap.put("/index.html","user");
并且设置c ...
12-Shiro的缓存管理
场景描述 现在再添加量Shiro标签后,以HTML形式进行权限管理。是否每一次点击页面的某个菜单,都要经过MyRealm的授权方法,从数据库里查数据。在MyRealm的doGetAuthorizationInfo打印一行sout(“———-查询用户权限—-”);看看登录成功后,引入index.html这句话打印了几次。现在用户zhoudu登录。
检测结果
由上图所示,在初始index.html时一共16个shiro标签,所以执行了16次授权方法。并且每次点击一个菜单又会调用授权方法。如点击“客户查询”,虽然没有用shiro标签修饰但是加上了权限判断的注解,也会打印”———-查询用户权限—-===”)。如下图。
说明无论是初始化,还是点击某个菜单都会查询数据库的数据,而且这些查询是同样的重复的操作,当用户很多时用户点击量很大时会频繁的访问数据库,非常消耗数据库的性能,所以在初始化界面时把数据从数据库里读出来存入缓存中,下次点击某个菜单直接从缓存里寻找,这样性能提高很多。
使用缓存引入依赖 首页springboot要支持缓存,在引入第三方缓 ...
11-Shiro的授权管理
权限管理的方式HTML页面限制 方式有两种,第一种是基于HTML页面展示的形式。在登录时查询到用户权限结合shiro标签库展示,展示出该用户所有的权限菜单。此方法有缺点,比如wangtaiwen用户是HR职务只有修改、查询客户这两个权限,在登录页面只能看到这两个菜单,但是ta无意间知道了“入库”权限的url,只要wangtaiwen是登录状态可以不用点击菜单直接输入url—>”localhost:8080/repoAdd.html”,就能越级访问。所以要在ShiroConfig中加入限制条件。只有改用户有sys:repo:save时才能访问“入库”
1filterMap.put("/repoAdd.html","perms[sys:repo:save]");
注解限制 此方式不依赖shiro标签,在进入index.html页面后不管用户身份是什么,展示全部的菜单。但是用户只能点击ta有权限的那些菜单,其它菜单看得见但是点不进去。这需要在每个菜单的a标签的href=url对应的controller方法上加上注解,说明 ...
10-Shiro的密码加密加盐
密码加密 一般加密的方式有2种,一种是base64加密是可以双向破解的。另一种的md5码加密只能由明文转成密文,不能有密文转成明文。这种单向转换更加安全,即使黑客进入数据库了无法根据密文密码登录。特别注意在注册时密码加密规则是什么就在shiro认证是告诉MyRealm密码匹配规则。myRealm最终匹配的是密文(先把input的密码转换成密文再和数据库的密文比对)代码如下
123456789101112131415在ShiroConfig类中@Bean public HashedCredentialsMatcher getHashedCredentialsMatcher (){ // 设置密码匹配规则 HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(); matcher.setHashAlgorithmName("md5"); matcher.setHashIterations(1); return matcher; ...
9-引入layui实现Shiro后台管理页面
引入layui 因为自己写的index.html页面简单难看,就要引入现成的框架Layui,可以去官网下载也可以引入SDN。把下载好的layui文件放入static中。
引入方式
本地引入
在head标签里 添加《link rel=”stylesheet” href=”layui/css/layui.css》
在底部 body的上方添加《script src=”layui/layui.js”></script》
SDN引入
在head标签里 添加《link rel=”stylesheet” href=”//unpkg.com/layui@2.6.8/dist/css/layui.css”》
在底部 body的上方添加《script src=”//unpkg.com ...
8-自定义Realm的配置
改变Realm来源 在ShiroConfig类中之前是连接JdbcRealm,JdbcRealm自动封装了认证和授权的SQL,而自定义realm到自己写,并且安全数据源要换成myRealm。
1234567891011@Beanpublic MyRealm getMyRealm(){ MyRealm myRealm = new MyRealm(); return myRealm;} @Beanpublic DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm) { DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); defaultWebSecurityManager.setRealm(myRealm); return defaultWebSecurityManager;}
配置MyRealm myReal ...





