后台管理员生成策略
问题:至少给出两种方案,第一个管理员从哪里来?
1、系统启动的时候,检查数据库,如果没有超级管理员用户则自动创建一个账户
(即ServletContextListener启动时,系统则已启动),它启动在前还是应用启动在前?ServletContextListener启动在前(没办法使用Spring)
2、提供一个toLogin方法,判断如果没有超级管理员,返回一个超级管理员注册页面,在进入后台管理登录页面之前,先执行login.do(页面也是从后台生成的,将login.html隐藏于WEB-INF中,通过login.do访问)
如果已经有,则跳转超级管理员登录页面
3、第一次启动应用时,会有登录界面,然后再后台写一个Controller(init.do),该方法在没有任何方法查找到连接,相当于其是一个隐藏的路径
只有程序员知道(留后门),返回的是一些系统的初始页面,完成超级管理员注册,如果系统已经初始化完成(即启动完系统,已经初始化系统,然后跳转登录界面)
再访问init.do时就无法访问
4、在Spring启动时,检查数据库,如果没有超级管理员就创建一个默认的,在ServletContextListener中使用JDBC来完成(几乎和第一种方式一样)--监听的是spring的启动
Spring事件机制(在spring中也有类似于Tomcat的事件)ServletContextListener监听的是tomcat的事件,提供两个方法来处理容器的启动以及销毁。
同理,在spring中也会有相关的事件(也可以在spring中添加一些监听器 来完成监听spring的监听事件)要使用spring的监听机制很简单,在后台创建一个新包(listener)--仅作为分包来用(监听器不是必须放在特定的包中)
在Spring中的监听器必须实现一个接口ApplicationListener,就可以作为spring的监听类,来监听spring中特殊的事件ApplicationListener E为要监听的事件类型
所有在在Spring中的事件(不管是spring自身的事件还是其他事件,都是ApplicationEvent的子类)类型称为applicationEvent
相当于在spring中,ApplicationEvent这个类相当于所有的事件(在spring中所有的类不止这个容器启动一种,在spring中可以自己定义事件,tomcat中无法自定义)
这个时候,如果E为ApplicationEvent,相当于该监听器要监听所有的的事件(消息)
规定实现一个默认方法:onApplicationEvent(ApplicationEvent event)(表示监听到指定的事件之后要做的操作)
此时,event作为对象传入,即这次监听到的事件
由于此时我们要监听的是初始化管理员的监听器,还写ApplicationEvent就代表Spring中所有的事件都会被监听到并响应,无法得到自定义的拦截器在什么时候运行
现在我们只想监听Spring容器启动完成的事件,所以使用另外一种监听器(ContextRefreshedEvent-上下文容器刷新的事件) 容器刷新就是容器启动了,它是spring事件的子事件
测试:
@Autowired private ILoginInfoService logininfoService; @Override public void onApplicationEvent(ContextRefreshedEvent event) { System.out.println("spring启动好了"+this.logininfoService); }
如果spring容器启动完成,则可以得到该对象
还需要配置告诉spring,@Component(代表这是一个组件)
如果写在公共模块上,会出问题(该公共模块前后台都需要使用,但该监听器只需要后台使用)
现在就可以完成第一个管理员的初始化动作了