摘要:项目介绍在之前的整合项目之后,新增日志简单集成,之前的代码不予展示与介绍,想了解的请参考整合项目项目代码获取项目结构代码控制层,,主要包含登录及几个页面跳转会跳到我们自定义的中登录用户名或密码错误业务处理层,包含一个包,以接口类型存在
spring-springmvc-mybatis-shiro项目介绍
在之前的mybatis整合项目之后,新增日志、简单集成shiro,之前的代码不予展示与介绍,想了解的请参考mybatis整合项目
项目代码获取:https://github.com/pysasuke/s...
controller:控制层,ShiroUserController,主要包含登录及几个页面跳转
@RequestMapping("/login") public String login(ShiroUser shiroUser, HttpServletRequest request) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(shiroUser.getUsername(), shiroUser.getPassword()); try { subject.login(token);//会跳到我们自定义的realm中 request.getSession().setAttribute("user", shiroUser); log.info(shiroUser.getUsername() + "登录"); return "success"; } catch (UnknownAccountException e) { request.getSession().setAttribute("user", shiroUser); return "login"; } catch (IncorrectCredentialsException e) { request.getSession().setAttribute("user", shiroUser); request.setAttribute("error", "用户名或密码错误!"); return "login"; } }
service:业务处理层,包含一个impl包,Service以接口类型存在,impl包下存放Service接口的实现类,ShiroUserServiceImpl包含用户、角色、权限相关操作
@Service("shiroUserService") public class ShiroUserServiceImpl implements ShiroUserService { @Resource private ShiroUserMapper shiroUserMapper; public ShiroUser getByUsername(String username) { return shiroUserMapper.getByUsername(username); } public SetgetRoles(String username) { return shiroUserMapper.getRoles(username); } public Set getPermissions(String username) { return shiroUserMapper.getPermissions(username); } }
dao:数据库交互层
model:实体对象层
realm: 自定义Realm(shiro相关)
public class MyRealm extends AuthorizingRealm { @Resource private ShiroUserService shiroUserService; // 为当前登陆成功的用户授予权限和角色,已经登陆成功了 @Override protected AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); //获取用户名 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.setRoles(shiroUserService.getRoles(username)); authorizationInfo.setStringPermissions(shiroUserService.getPermissions(username)); return authorizationInfo; } // 验证当前登录的用户,获取认证信息 @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); // 获取用户名 ShiroUser shiroUser = shiroUserService.getByUsername(username); if (shiroUser != null) { AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(shiroUser.getUsername(), shiroUser.getPassword(), "myRealm"); return authcInfo; } else { return null; } } }resources:配置文件
application.xml:spring配置文件入口,加载spring-config.xml
spring-mvc.xml:springmvc配置相关文件
spring-config.xml:加载其他集成的配置文件,这里加载spring-mybatis.xml、spring-shiro.xml和db.properties
spring-mybatis.xml:mybatis相关配置文件
spring-shiro.xml:shiro配置相关文件
/shiro/user/logout = logout /shiro/user/login=anon /shiro/user/person*=authc /shiro/user/student*/**=roles[student] /shiro/user/teacher*/**=perms["user:create"]
db.properties:数据库相关参数
log4j.properties:日志相关配置
###Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG log4j.rootLogger=info, console, log, error ###Console ### #输出到控制台 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern = %d %p[%C:%L]- %m%n ### log ### #输出到文件 log4j.appender.log = org.apache.log4j.DailyRollingFileAppender #日志编码设置 log4j.appender.log.Encoding=UTF-8 #文件路径(绝对路径) log4j.appender.log.File = E:/my_project/spring-springmvc-mybatis/logs/log.log #true为追加,false为覆盖,默认为true log4j.appender.log.Append = true #针对DEBUG级别以上的日志,低于DEBUG级别的日志不显示,这里设置为DEBUG没有意义 log4j.appender.log.Threshold = DEBUG log4j.appender.log.DatePattern="."yyyy-MM-dd #指定布局模式 log4j.appender.log.layout = org.apache.log4j.PatternLayout log4j.appender.log.layout.ConversionPattern = %d %p[%c:%L] - %m%n ### Error ### log4j.appender.error = org.apache.log4j.DailyRollingFileAppender log4j.appender.error.File = E:/my_project/spring-springmvc-mybatis/logs/error.log log4j.appender.error.Append = true log4j.appender.error.Threshold = ERROR log4j.appender.error.DatePattern="."yyyy-MM-dd log4j.appender.error.layout = org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern =%d %p[%c:%L] - %m%n ###控制台打印sql配置 log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
mapping:存放mybatis映射文件,以UserMapper.xml为例
webapp:web相关
web.xml
其他文件 logs:日志存放shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /*
error.log:记录error级别日志
log.log:记录其他日志
deploy:部署文件,sqlupdate.sql
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `t_permission` -- ---------------------------- DROP TABLE IF EXISTS `t_permission`; CREATE TABLE `t_permission` ( `id` int(11) NOT NULL, `role_id` int(11) NOT NULL, `permissionname` varchar(100) COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -- ---------------------------- -- Records of t_permission -- ---------------------------- INSERT INTO `t_permission` VALUES ("1", "1", "user:create"); INSERT INTO `t_permission` VALUES ("2", "2", "user:update"); -- ---------------------------- -- Table structure for `t_role` -- ---------------------------- DROP TABLE IF EXISTS `t_role`; CREATE TABLE `t_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `rolename` varchar(20) COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -- ---------------------------- -- Records of t_role -- ---------------------------- INSERT INTO `t_role` VALUES ("1", "teacher"); INSERT INTO `t_role` VALUES ("2", "student"); -- ---------------------------- -- Table structure for `t_user` -- ---------------------------- DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8mb4_bin NOT NULL, `password` varchar(20) COLLATE utf8mb4_bin NOT NULL, `role_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -- ---------------------------- -- Records of t_user -- ---------------------------- INSERT INTO `t_user` VALUES ("1", "admin", "admin", "1"); INSERT INTO `t_user` VALUES ("2", "test", "123456", "2"); -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(32) COLLATE utf8mb4_bin NOT NULL, `password` varchar(32) COLLATE utf8mb4_bin NOT NULL, `email` varchar(32) COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ("1", "张三", "123456", "835852265@qq.com");pom.xml:maven相关
log4j log4j ${log4j.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} org.apache.shiro shiro-all ${shiro-version} org.projectlombok lombok 1.16.8
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70331.html
摘要:作者重庆森林链接来源牛客网整个三月份通过牛客网和网友分享的经验学到了很多东西,现在反馈一下我的面试经历,希望对同学们有帮助。个人情况大三本方向渣硕,经过实验室学长内推,于三月底完成面试。校招是实力和运气的结合,缺一不可。 欢迎关注我的微信公众号:Java面试通关手册(坚持原创,分享美文,分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取):showImg(h...
面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,决定一次面试的成败,那么面试时如果介绍自己的项目呢? 1、在面试前准备项目描述 别害怕,因为面试官什么都不知道,面试官是人,不是神,拿到你的简历的时候,是没法核实你的项目细节的。更何况,你做的项目是以月为单位算的,而面试官最多用30分钟来从你的简历上了解你的项目经验,所以你对项目的熟悉程度要远远超过面试官,所以你一点也不用紧张...
面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,决定一次面试的成败,那么面试时如果介绍自己的项目呢? 1、在面试前准备项目描述 别害怕,因为面试官什么都不知道,面试官是人,不是神,拿到你的简历的时候,是没法核实你的项目细节的。更何况,你做的项目是以月为单位算的,而面试官最多用30分钟来从你的简历上了解你的项目经验,所以你对项目的熟悉程度要远远超过面试官,所以你一点也不用紧张...
摘要:我觉得了解简历和面试的技巧可以帮助你更好的去学习重要的知识点以及更好地去准备面试以及面试,说实话,我个人觉得这些东西还挺重要的。在本文里,我将介绍我这段时间里更新简历和面试的相关经历。 分享一篇很不错的文章!本文作者曾经写过《Java Web轻量级开发面试教程》和 《Java核心技术及面试指南》这两本书。我觉得了解简历和面试的技巧可以帮助你更好的去学习重要的知识点以及更好地去准备面试以...
阅读 2666·2021-11-18 10:02
阅读 3427·2021-09-22 15:50
阅读 2360·2021-09-06 15:02
阅读 3580·2019-08-29 16:34
阅读 1747·2019-08-29 13:49
阅读 1277·2019-08-29 13:29
阅读 3631·2019-08-28 18:08
阅读 2939·2019-08-26 11:52