这几天粗浅的把shiro整合到spring中,并且注解控制shiro用户/角色/权限And/OR

步骤:

1.首先maven搭建web项目

2.创建数据库 user/role/authority 其中,role->user是一对多,role->authority是多对多

shiros.sql内容:

  1. /*
  2. SQLyog Ultimate v11.24 (32 bit)
  3. MySQL - 5.5.41 : Database - shiros
  4. *********************************************************************
  5. */
  6.  
  7. /*!40101 SET NAMES utf8 */;
  8.  
  9. /*!40101 SET SQL_MODE=''*/;
  10.  
  11. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  12. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  13. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  14. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  15. CREATE DATABASE /*!32312 IF NOT EXISTS*/`shiros` /*!40100 DEFAULT CHARACTER SET utf8 */;
  16.  
  17. USE `shiros`;
  18.  
  19. /*Table structure for table `authority` */
  20.  
  21. DROP TABLE IF EXISTS `authority`;
  22.  
  23. CREATE TABLE `authority` (
  24. `authorityId` varchar(36) NOT NULL,
  25. `authorityName` varchar(20) DEFAULT NULL,
  26. `authorityContent` varchar(500) DEFAULT NULL,
  27. PRIMARY KEY (`authorityId`)
  28. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  29.  
  30. /*Data for the table `authority` */
  31.  
  32. insert into `authority`(`authorityId`,`authorityName`,`authorityContent`) values ('97e2a86d-802c-415f-8d2e-6d94a3390001','疾病:增加',NULL),('97e2a86d-802c-415f-8d2e-6d94a3390002','疾病:删除',NULL),('97e2a86d-802c-415f-8d2e-6d94a3390003','疾病:修改',NULL),('97e2a86d-802c-415f-8d2e-6d94a3390004','疾病:查看',NULL),('97e2a86d-802c-415f-8d2e-6d94a3390005','产品:增加',NULL),('97e2a86d-802c-415f-8d2e-6d94a3390006','产品:删除',NULL),('97e2a86d-802c-415f-8d2e-6d94a3390007','产品:修改',NULL),('97e2a86d-802c-415f-8d2e-6d94a3390008','产品:查看',NULL);
  33.  
  34. /*Table structure for table `role` */
  35.  
  36. DROP TABLE IF EXISTS `role`;
  37.  
  38. CREATE TABLE `role` (
  39. `roleId` varchar(36) NOT NULL,
  40. `roleName` varchar(36) DEFAULT NULL,
  41. `roleGrade` int(11) DEFAULT NULL,
  42. PRIMARY KEY (`roleId`)
  43. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  44.  
  45. /*Data for the table `role` */
  46.  
  47. insert into `role`(`roleId`,`roleName`,`roleGrade`) values ('97e2a86d-802c-415f-8d2e-6d94a3390121','管理员3',1),('97e2a86d-802c-415f-8d2e-6d94a3390122','管理员2',1),('97e2a86d-802c-415f-8d2e-6d94a3390123','管理员1',1);
  48.  
  49. /*Table structure for table `roleauthority` */
  50.  
  51. DROP TABLE IF EXISTS `roleauthority`;
  52.  
  53. CREATE TABLE `roleauthority` (
  54. `roleId` varchar(36) NOT NULL,
  55. `authorityId` varchar(36) NOT NULL,
  56. PRIMARY KEY (`roleId`,`authorityId`),
  57. KEY `FK_Relationship_3` (`authorityId`),
  58. CONSTRAINT `FK_Relationship_2` FOREIGN KEY (`roleId`) REFERENCES `role` (`roleId`),
  59. CONSTRAINT `FK_Relationship_3` FOREIGN KEY (`authorityId`) REFERENCES `authority` (`authorityId`)
  60. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  61.  
  62. /*Data for the table `roleauthority` */
  63.  
  64. insert into `roleauthority`(`roleId`,`authorityId`) values ('97e2a86d-802c-415f-8d2e-6d94a3390123','97e2a86d-802c-415f-8d2e-6d94a3390001'),('97e2a86d-802c-415f-8d2e-6d94a3390123','97e2a86d-802c-415f-8d2e-6d94a3390002'),('97e2a86d-802c-415f-8d2e-6d94a3390123','97e2a86d-802c-415f-8d2e-6d94a3390003'),('97e2a86d-802c-415f-8d2e-6d94a3390123','97e2a86d-802c-415f-8d2e-6d94a3390004'),('97e2a86d-802c-415f-8d2e-6d94a3390122','97e2a86d-802c-415f-8d2e-6d94a3390005'),('97e2a86d-802c-415f-8d2e-6d94a3390122','97e2a86d-802c-415f-8d2e-6d94a3390006');
  65.  
  66. /*Table structure for table `user` */
  67.  
  68. DROP TABLE IF EXISTS `user`;
  69.  
  70. CREATE TABLE `user` (
  71. `userId` varchar(36) NOT NULL,
  72. `roleId` varchar(36) NOT NULL,
  73. `userName` varchar(20) DEFAULT NULL,
  74. `password` varchar(20) DEFAULT NULL,
  75. PRIMARY KEY (`userId`),
  76. KEY `FK_Relationship_1` (`roleId`),
  77. CONSTRAINT `FK_Relationship_1` FOREIGN KEY (`roleId`) REFERENCES `role` (`roleId`)
  78. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  79.  
  80. /*Data for the table `user` */
  81.  
  82. insert into `user`(`userId`,`roleId`,`userName`,`password`) values ('97e2a86d-802c-415f-8d2e-6d94a3390110','97e2a86d-802c-415f-8d2e-6d94a3390122','李四','123456'),('97e2a86d-802c-415f-8d2e-6d94a3390111','97e2a86d-802c-415f-8d2e-6d94a3390123','张三','123456'),('97e2a86d-802c-415f-8d2e-6d94a3390112','97e2a86d-802c-415f-8d2e-6d94a3390121','王五','123456');
  83.  
  84. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  85. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  86. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  87. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

3.创建完成之后,使用hibernate反转工具,生成实体

user.java

  1. package com.sxd.entity;
  2.  
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.FetchType;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.Id;
  8. import javax.persistence.JoinColumn;
  9. import javax.persistence.ManyToOne;
  10. import javax.persistence.Table;
  11. import org.hibernate.annotations.GenericGenerator;
  12.  
  13. /**
  14. * User entity. @author MyEclipse Persistence Tools
  15. */
  16. @Entity
  17. @Table(name = "user", catalog = "shiros")
  18. public class User implements java.io.Serializable {
  19.  
  20. // Fields
  21.  
  22. private String userId;
  23. private Role role;
  24. private String userName;
  25. private String password;
  26.  
  27. // Constructors
  28.  
  29. /** default constructor */
  30. public User() {
  31. }
  32.  
  33. /** minimal constructor */
  34. public User(Role role) {
  35. this.role = role;
  36. }
  37.  
  38. /** full constructor */
  39. public User(Role role, String userName, String password) {
  40. this.role = role;
  41. this.userName = userName;
  42. this.password = password;
  43. }
  44.  
  45. // Property accessors
  46. @GenericGenerator(name = "generator", strategy = "uuid.hex")
  47. @Id
  48. @GeneratedValue(generator = "generator")
  49. @Column(name = "userId", unique = true, nullable = false, length = 36)
  50. public String getUserId() {
  51. return this.userId;
  52. }
  53.  
  54. public void setUserId(String userId) {
  55. this.userId = userId;
  56. }
  57.  
  58. @ManyToOne(fetch = FetchType.LAZY)
  59. @JoinColumn(name = "roleId", nullable = false)
  60. public Role getRole() {
  61. return this.role;
  62. }
  63.  
  64. public void setRole(Role role) {
  65. this.role = role;
  66. }
  67.  
  68. @Column(name = "userName", length = 20)
  69. public String getUserName() {
  70. return this.userName;
  71. }
  72.  
  73. public void setUserName(String userName) {
  74. this.userName = userName;
  75. }
  76.  
  77. @Column(name = "password", length = 20)
  78. public String getPassword() {
  79. return this.password;
  80. }
  81.  
  82. public void setPassword(String password) {
  83. this.password = password;
  84. }
  85.  
  86. }

role.java

  1. package com.sxd.entity;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.FetchType;
  9. import javax.persistence.GeneratedValue;
  10. import javax.persistence.Id;
  11. import javax.persistence.JoinColumn;
  12. import javax.persistence.JoinTable;
  13. import javax.persistence.ManyToMany;
  14. import javax.persistence.OneToMany;
  15. import javax.persistence.Table;
  16. import org.hibernate.annotations.GenericGenerator;
  17.  
  18. /**
  19. * Role entity. @author MyEclipse Persistence Tools
  20. */
  21. @Entity
  22. @Table(name = "role", catalog = "shiros")
  23. public class Role implements java.io.Serializable {
  24.  
  25. // Fields
  26.  
  27. private String roleId;
  28. private String roleName;
  29. private Integer roleGrade;
  30. private Set<Authority> authorities = new HashSet<Authority>(0);
  31. private Set<User> users = new HashSet<User>(0);
  32.  
  33. // Constructors
  34.  
  35. /** default constructor */
  36. public Role() {
  37. }
  38.  
  39. /** full constructor */
  40. public Role(String roleName, Integer roleGrade, Set<Authority> authorities,
  41. Set<User> users) {
  42. this.roleName = roleName;
  43. this.roleGrade = roleGrade;
  44. this.authorities = authorities;
  45. this.users = users;
  46. }
  47.  
  48. // Property accessors
  49. @GenericGenerator(name = "generator", strategy = "uuid.hex")
  50. @Id
  51. @GeneratedValue(generator = "generator")
  52. @Column(name = "roleId", unique = true, nullable = false, length = 36)
  53. public String getRoleId() {
  54. return this.roleId;
  55. }
  56.  
  57. public void setRoleId(String roleId) {
  58. this.roleId = roleId;
  59. }
  60.  
  61. @Column(name = "roleName", length = 36)
  62. public String getRoleName() {
  63. return this.roleName;
  64. }
  65.  
  66. public void setRoleName(String roleName) {
  67. this.roleName = roleName;
  68. }
  69.  
  70. @Column(name = "roleGrade")
  71. public Integer getRoleGrade() {
  72. return this.roleGrade;
  73. }
  74.  
  75. public void setRoleGrade(Integer roleGrade) {
  76. this.roleGrade = roleGrade;
  77. }
  78.  
  79. @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  80. @JoinTable(name = "roleauthority", catalog = "shiros", joinColumns = { @JoinColumn(name = "roleId", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "authorityId", nullable = false, updatable = false) })
  81. public Set<Authority> getAuthorities() {
  82. return this.authorities;
  83. }
  84.  
  85. public void setAuthorities(Set<Authority> authorities) {
  86. this.authorities = authorities;
  87. }
  88.  
  89. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "role")
  90. public Set<User> getUsers() {
  91. return this.users;
  92. }
  93.  
  94. public void setUsers(Set<User> users) {
  95. this.users = users;
  96. }
  97.  
  98. }

Authority.java

  1. package com.sxd.entity;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.FetchType;
  9. import javax.persistence.GeneratedValue;
  10. import javax.persistence.Id;
  11. import javax.persistence.ManyToMany;
  12. import javax.persistence.Table;
  13. import org.hibernate.annotations.GenericGenerator;
  14.  
  15. /**
  16. * Authority entity. @author MyEclipse Persistence Tools
  17. */
  18. @Entity
  19. @Table(name = "authority", catalog = "shiros")
  20. public class Authority implements java.io.Serializable {
  21.  
  22. // Fields
  23.  
  24. private String authorityId;
  25. private String authorityName;
  26. private String authorityContent;
  27. private Set<Role> roles = new HashSet<Role>(0);
  28.  
  29. // Constructors
  30.  
  31. /** default constructor */
  32. public Authority() {
  33. }
  34.  
  35. /** full constructor */
  36. public Authority(String authorityName, String authorityContent,
  37. Set<Role> roles) {
  38. this.authorityName = authorityName;
  39. this.authorityContent = authorityContent;
  40. this.roles = roles;
  41. }
  42.  
  43. // Property accessors
  44. @GenericGenerator(name = "generator", strategy = "uuid.hex")
  45. @Id
  46. @GeneratedValue(generator = "generator")
  47. @Column(name = "authorityId", unique = true, nullable = false, length = 36)
  48. public String getAuthorityId() {
  49. return this.authorityId;
  50. }
  51.  
  52. public void setAuthorityId(String authorityId) {
  53. this.authorityId = authorityId;
  54. }
  55.  
  56. @Column(name = "authorityName", length = 20)
  57. public String getAuthorityName() {
  58. return this.authorityName;
  59. }
  60.  
  61. public void setAuthorityName(String authorityName) {
  62. this.authorityName = authorityName;
  63. }
  64.  
  65. @Column(name = "authorityContent", length = 500)
  66. public String getAuthorityContent() {
  67. return this.authorityContent;
  68. }
  69.  
  70. public void setAuthorityContent(String authorityContent) {
  71. this.authorityContent = authorityContent;
  72. }
  73.  
  74. @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "authorities")
  75. public Set<Role> getRoles() {
  76. return this.roles;
  77. }
  78.  
  79. public void setRoles(Set<Role> roles) {
  80. this.roles = roles;
  81. }
  82.  
  83. }

4.接下来,pom.xml文件配置

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.sxd.shiro</groupId>
  4. <artifactId>shiro-first</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <packaging>war</packaging>
  7. <build>
  8. <plugins>
  9. <plugin>
  10. <artifactId>maven-war-plugin</artifactId>
  11. <configuration>
  12. <version>3.0</version>
  13. </configuration>
  14. </plugin>
  15. </plugins>
  16. </build>
  17.  
  18. <properties>
  19. <shiro.version>1.3.2</shiro.version>
  20. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21. <spring.version>4.1.4.RELEASE</spring.version>
  22. <hibernate.version>4.3.8.Final</hibernate.version>
  23. </properties>
  24.  
  25. <dependencies>
  26. <!-- Logging API + implementation: -->
  27. <dependency>
  28. <groupId>org.slf4j</groupId>
  29. <artifactId>slf4j-api</artifactId>
  30. <version>1.7.21</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.slf4j</groupId>
  34. <artifactId>jcl-over-slf4j</artifactId>
  35. <version>1.7.21</version>
  36. <scope>runtime</scope>
  37. </dependency>
  38.  
  39. <!-- Shiro dependencies: -->
  40. <dependency>
  41. <groupId>org.apache.shiro</groupId>
  42. <artifactId>shiro-core</artifactId>
  43. <version>${shiro.version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.apache.shiro</groupId>
  47. <artifactId>shiro-web</artifactId>
  48. <version>${shiro.version}</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.apache.shiro</groupId>
  52. <artifactId>shiro-spring</artifactId>
  53. <version>${shiro.version}</version>
  54. </dependency>
  55.  
  56. <!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api -->
  57. <dependency>
  58. <groupId>javax.persistence</groupId>
  59. <artifactId>persistence-api</artifactId>
  60. <version>1.0</version>
  61. </dependency>
  62. <!-- 进行加密操作 -->
  63. <dependency>
  64. <groupId>commons-codec</groupId>
  65. <artifactId>commons-codec</artifactId>
  66. <version>1.10</version>
  67. </dependency>
  68.  
  69. <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
  70. <dependency>
  71. <groupId>dom4j</groupId>
  72. <artifactId>dom4j</artifactId>
  73. <version>1.6.1</version>
  74. </dependency>
  75.  
  76. <!-- 微信开发工具包 -->
  77.  
  78. <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-common -->
  79. <dependency>
  80. <groupId>com.github.binarywang</groupId>
  81. <artifactId>weixin-java-common</artifactId>
  82. <version>2.2.0</version>
  83. </dependency>
  84. <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-mp -->
  85. <dependency>
  86. <groupId>com.github.binarywang</groupId>
  87. <artifactId>weixin-java-mp</artifactId>
  88. <version>2.2.0</version>
  89. </dependency>
  90.  
  91. <!-- junit -->
  92. <dependency>
  93. <groupId>junit</groupId>
  94. <artifactId>junit</artifactId>
  95. <version>4.12</version>
  96. <scope>test</scope>
  97. </dependency>
  98.  
  99. <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
  100. <dependency>
  101. <groupId>com.github.pagehelper</groupId>
  102. <artifactId>pagehelper</artifactId>
  103. <version>4.1.4</version>
  104. </dependency>
  105.  
  106. <!-- spring -->
  107. <dependency>
  108. <groupId>org.springframework</groupId>
  109. <artifactId>spring-core</artifactId>
  110. <version>${spring.version}</version>
  111. </dependency>
  112.  
  113. <dependency>
  114. <groupId>org.springframework</groupId>
  115. <artifactId>spring-beans</artifactId>
  116. <version>${spring.version}</version>
  117. </dependency>
  118.  
  119. <dependency>
  120. <groupId>org.springframework</groupId>
  121. <artifactId>spring-context</artifactId>
  122. <version>${spring.version}</version>
  123. </dependency>
  124.  
  125. <dependency>
  126. <groupId>org.springframework</groupId>
  127. <artifactId>spring-tx</artifactId>
  128. <version>${spring.version}</version>
  129. </dependency>
  130.  
  131. <dependency>
  132. <groupId>org.springframework</groupId>
  133. <artifactId>spring-web</artifactId>
  134. <version>${spring.version}</version>
  135. </dependency>
  136.  
  137. <dependency>
  138. <groupId>org.springframework</groupId>
  139. <artifactId>spring-test</artifactId>
  140. <version>${spring.version}</version>
  141. <scope>test</scope>
  142. </dependency>
  143.  
  144. <!-- 使用SpringMVC需配置 -->
  145. <dependency>
  146. <groupId>org.springframework</groupId>
  147. <artifactId>spring-webmvc</artifactId>
  148. <version>${spring.version}</version>
  149. </dependency>
  150. <!-- spring cglib 代理 -->
  151. <dependency>
  152. <groupId>cglib</groupId>
  153. <artifactId>cglib</artifactId>
  154. <version>2.2.2</version>
  155. </dependency>
  156. <!-- 关系型数据库整合时需配置 如hibernate jpa等 -->
  157. <dependency>
  158. <groupId>org.springframework</groupId>
  159. <artifactId>spring-orm</artifactId>
  160. <version>${spring.version}</version>
  161. </dependency>
  162.  
  163. <!-- hibernate -->
  164. <dependency>
  165. <groupId>org.hibernate</groupId>
  166. <artifactId>hibernate-core</artifactId>
  167. <version>${hibernate.version}</version>
  168.  
  169. </dependency>
  170.  
  171. <dependency>
  172. <groupId>org.hibernate</groupId>
  173. <artifactId>hibernate-ehcache</artifactId>
  174. <version>${hibernate.version}</version>
  175. </dependency>
  176.  
  177. <!-- 二级缓存ehcache -->
  178. <dependency>
  179. <groupId>net.sf.ehcache</groupId>
  180. <artifactId>ehcache</artifactId>
  181. <version>2.9.0</version>
  182. </dependency>
  183.  
  184. <!-- log4j -->
  185. <dependency>
  186. <groupId>log4j</groupId>
  187. <artifactId>log4j</artifactId>
  188. <version>1.2.17</version>
  189. </dependency>
  190.  
  191. <!-- mysql连接 -->
  192. <dependency>
  193. <groupId>mysql</groupId>
  194. <artifactId>mysql-connector-java</artifactId>
  195. <version>5.1.34</version>
  196. </dependency>
  197.  
  198. <!-- c3p0数据源 -->
  199. <dependency>
  200. <groupId>com.mchange</groupId>
  201. <artifactId>c3p0</artifactId>
  202. <version>0.9.5-pre10</version>
  203. </dependency>
  204.  
  205. <!-- json -->
  206.  
  207. <!-- 1号 -->
  208. <dependency>
  209. <groupId>com.fasterxml.jackson.core</groupId>
  210. <artifactId>jackson-core</artifactId>
  211. <version>2.8.1</version>
  212. </dependency>
  213. <!-- 2号 -->
  214. <dependency>
  215. <groupId>com.fasterxml.jackson.core</groupId>
  216. <artifactId>jackson-annotations</artifactId>
  217. <version>2.8.1</version>
  218. </dependency>
  219.  
  220. <!-- 3号 -->
  221. <dependency>
  222. <groupId>com.fasterxml.jackson.core</groupId>
  223. <artifactId>jackson-databind</artifactId>
  224. <version>2.8.1</version>
  225. <exclusions>
  226. <exclusion>
  227. <artifactId>jackson-core</artifactId>
  228. <groupId>com.fasterxml.jackson.core</groupId>
  229. </exclusion>
  230. <exclusion>
  231. <artifactId>jackson-annotations</artifactId>
  232. <groupId>com.fasterxml.jackson.core</groupId>
  233. </exclusion>
  234. </exclusions>
  235. </dependency>
  236.  
  237. <!-- 4号 -->
  238. <dependency>
  239. <groupId>com.google.code.gson</groupId>
  240. <artifactId>gson</artifactId>
  241. <version>2.7</version>
  242. </dependency>
  243. <!-- 5号 -->
  244. <dependency>
  245. <groupId>net.sf.json-lib</groupId>
  246. <artifactId>json-lib</artifactId>
  247. <version>2.4</version>
  248. <classifier>jdk15</classifier>
  249. </dependency>
  250. <!-- 5号json-lib还需要以下依赖包 -->
  251. <dependency>
  252. <groupId>commons-lang</groupId>
  253. <artifactId>commons-lang</artifactId>
  254. <version>2.5</version>
  255. </dependency>
  256. <dependency>
  257. <groupId>commons-beanutils</groupId>
  258. <artifactId>commons-beanutils</artifactId>
  259. <version>1.9.2</version>
  260. </dependency>
  261. <dependency>
  262. <groupId>commons-collections</groupId>
  263. <artifactId>commons-collections</artifactId>
  264. <version>3.2.1</version>
  265. </dependency>
  266. <dependency>
  267. <groupId>commons-logging</groupId>
  268. <artifactId>commons-logging</artifactId>
  269. <version>1.2</version>
  270. </dependency>
  271.  
  272. <!-- aop -->
  273. <dependency>
  274. <groupId>org.aspectj</groupId>
  275. <artifactId>aspectjweaver</artifactId>
  276. <version>1.8.4</version>
  277. </dependency>
  278.  
  279. <!-- servlet -->
  280. <dependency>
  281. <groupId>javax.servlet</groupId>
  282. <artifactId>servlet-api</artifactId>
  283. <version>3.0-alpha-1</version>
  284. <scope>provided</scope>
  285. </dependency>
  286.  
  287. <dependency>
  288. <groupId>javax.servlet</groupId>
  289. <artifactId>jstl</artifactId>
  290. <version>1.2</version>
  291. </dependency>
  292. <!-- guava 集合的交并操作 -->
  293. <dependency>
  294. <groupId>com.google.guava</groupId>
  295. <artifactId>guava</artifactId>
  296. <version>19.0</version>
  297. </dependency>
  298. <dependency>
  299. <groupId>com.google.guava</groupId>
  300. <artifactId>guava-collections</artifactId>
  301. <version>r03</version>
  302. </dependency>
  303.  
  304. <!-- 文件上传 -->
  305. <dependency>
  306. <groupId>commons-fileupload</groupId>
  307. <artifactId>commons-fileupload</artifactId>
  308. <version>1.3.1</version>
  309. </dependency>
  310.  
  311. </dependencies>
  312.  
  313. </project>

尤其注意,这里着重看一下shiro的架包就是下面三个:版本号自行选择

  1. <!-- Shiro dependencies: -->
  2. <dependency>
  3. <groupId>org.apache.shiro</groupId>
  4. <artifactId>shiro-core</artifactId>
  5. <version>${shiro.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.shiro</groupId>
  9. <artifactId>shiro-web</artifactId>
  10. <version>${shiro.version}</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.shiro</groupId>
  14. <artifactId>shiro-spring</artifactId>
  15. <version>${shiro.version}</version>
  16. </dependency>

5.为实体生成对应的Dao/service以及其impl

GenericDao.java

  1. package com.sxd.dao;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.hibernate.Criteria;
  9. import org.hibernate.criterion.Criterion;
  10. import org.hibernate.criterion.DetachedCriteria;
  11.  
  12. import com.github.pagehelper.PageInfo;
  13.  
  14. public interface GenericDao<T, PK extends Serializable> {
  15. /**
  16. * 查询全部,可以排序
  17. * @param orderBy
  18. * @param isAsc
  19. * @return List<T>
  20. */
  21. public List<T> list(Criteria criteria);
  22.  
  23. /**
  24. * 查询全部,可以排序
  25. * @param orderBy
  26. * @param isAsc
  27. * @return List<T>
  28. */
  29. public List<T> list(String orderBy, boolean isAsc);
  30.  
  31. /**
  32. * 离线查询
  33. * @param criteria
  34. * @return List<T>
  35. */
  36. public List<T> list(DetachedCriteria criteria);
  37.  
  38. /**
  39. * 根据Criteria查询条件,获取总数
  40. * @param criteria
  41. * @return int
  42. * @throws SecurityException
  43. * @throws NoSuchFieldException
  44. * @throws IllegalAccessException
  45. * @throws IllegalArgumentException
  46. */
  47. public int countAll(Criteria criteria);
  48.  
  49. /**
  50. * 获取总数(默认为entityClass) 即查询总条数
  51. * @return int
  52. */
  53. public int countAll();
  54.  
  55. /**
  56. * 根据I判断是否存在
  57. * @param id
  58. * @return boolean
  59. */
  60. public boolean exists(PK id);
  61.  
  62. /**
  63. * 保存实体
  64. * @param t 实体参数
  65. */
  66. public void save(T t);
  67.  
  68. /**
  69. * 保存或者更新实体
  70. * @param t 实体
  71. */
  72. public void saveOrUpdate(T t);
  73.  
  74. /**
  75. * 加载实体的通过load方法
  76. * @param id 实体的id
  77. * @return 查询出来的实体
  78. */
  79. public T load(PK id);
  80.  
  81. /**
  82. * 合并实体
  83. * @param entity
  84. */
  85. public void merge(T entity);
  86.  
  87. /**
  88. * 查找全部
  89. */
  90. public List<T> findAll();
  91.  
  92. /**
  93. * 通过get方法加载实体的
  94. * @param id 实体的id
  95. * @return 查询出来的实体
  96. */
  97. public T get(PK id);
  98.  
  99. /**
  100. * contains
  101. * @param t 实体
  102. * @return 是否包含
  103. */
  104. public boolean contains(T t);
  105.  
  106. /**
  107. * delete
  108. * @param t
  109. * 删除实体
  110. */
  111. public void delete(T t);
  112.  
  113. /**
  114. * 根据ID删除数据
  115. * @param Id 实体id
  116. * @return 是否删除成功
  117. */
  118. public boolean deleteById(PK Id);
  119.  
  120. /**
  121. * 删除所有
  122. * @param entities 实体的Collection集合
  123. */
  124. public void deleteAll(Collection<T> entities);
  125.  
  126. /**
  127. * 执行Hql语句 要求 hql中参数顺序与可变参数 中参数顺序相一致
  128. * @param hqlString hql
  129. * @param values 不定参数数组
  130. */
  131. public void queryHql(String hqlString, Object... values);
  132.  
  133. /**
  134. * 执行Sql语句(不建议用,影响扩展)
  135. * @param sqlString sql
  136. * @param values 不定参数数组
  137. */
  138. public void querySql(String sqlString, Object... values);
  139.  
  140. /**
  141. * 根据HQL语句查找唯一实体
  142. *
  143. * @param hqlString HQL语句
  144. * @param values 不定参数的Object数组
  145. * @return 查询实体
  146. */
  147. public T getByHQL(String hqlString, Object... values);
  148.  
  149. /**
  150. * 根据SQL语句查找唯一实体(不建议用,影响扩展)
  151. * @param sqlString SQL语句
  152. * @param values 不定参数的Object数组
  153. * @return 查询实体
  154. */
  155.  
  156. /**
  157. * 根据HQL语句,得到对应的list
  158. * @param hqlString HQL语句
  159. * @param values 不定参数的Object数组
  160. * @return 查询多个实体的List集合
  161. */
  162. public List<T> getListByHQL(String hqlString, Object... values);
  163.  
  164. /**
  165. * 根据SQL语句,得到对应的list(不建议用,影响扩展)
  166. * @param sqlString HQL语句
  167. * @param values 不定参数的Object数组
  168. * @return 查询多个实体的List集合
  169. */
  170. public List<T> getListBySQL(String sqlString,Class c, Object... values);
  171.  
  172. /**
  173. * refresh 刷新实体,强制与数据库两步 refresh方法应该是数据库的数据更新到本地的person实体中,而不是本地person更新数据到数据库中 也就是执行refresh方法是更新了java代码中变量的数据值
  174. * @param t 实体
  175. */
  176. public void refresh(T t);
  177.  
  178. /**
  179. * update
  180. * @param t
  181. * 更新的是数据库中的数据
  182. */
  183. public void update(T t);
  184.  
  185. /**
  186. * 根据HQL得到记录数
  187. * @param hql HQL语句
  188. * @param values 不定参数的Object数组
  189. * @return 记录总数
  190. */
  191. public Long countByHql(String hql, Object... values);
  192.  
  193. /**
  194. * HQL分页查询
  195. *
  196. * @param hql HQL语句
  197. * @param countHql 查询记录条数的HQL语句
  198. * @param pageNo 下一页
  199. * @param pageSize 一页总条数
  200. * @param values 不定Object数组参数
  201. * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合
  202. */
  203. public PageInfo<T> findPageByHql(String hql, String countHql, int pageNo, int pageSize, Object... values);
  204.  
  205. /**
  206. * 按属性查找对象列表,匹配方式为相等
  207. * @param propertyName
  208. * @param value
  209. * @return List<T>
  210. */
  211. public List<T> list(String propertyName, Object value);
  212.  
  213. /**
  214. * 根据criterion查询条件获取数据列表
  215. * @param criterion
  216. * @return List<T>
  217. */
  218. public List<T> list(Criterion criterion);
  219.  
  220. /**
  221. * 按Criteria查询对象列表
  222. * @param criterions
  223. * @return List<T>
  224. */
  225. public List<T> list(Criterion... criterions);
  226.  
  227. /**
  228. * 按属性查找唯一对象,匹配方式为相等
  229. * @param propertyName
  230. * @param value
  231. * @return T
  232. */
  233. public T uniqueResult(String propertyName, Object value);
  234.  
  235. /**
  236. * 按Criteria查询唯一对象
  237. * @param criterions
  238. * @return T
  239. */
  240. public T uniqueResult(Criterion... criterions);
  241.  
  242. /**
  243. * 按Criteria查询唯一对象
  244. * @param criteria
  245. * @return T
  246. */
  247. public T uniqueResult(Criteria criteria);
  248.  
  249. /**
  250. * 按criteria查询某个Integer类型的字段
  251. * @param criteria
  252. * @return
  253. */
  254. public Integer uniqueResultInt(Criteria criteria);
  255.  
  256. /**
  257. * 为Criteria添加distinct transformer
  258. * @param criteria
  259. * @return Criteria
  260. */
  261. public Criteria distinct(Criteria criteria);
  262.  
  263. /**
  264. * 刷新session
  265. */
  266. public void flush();
  267.  
  268. /**
  269. * 清空session
  270. */
  271. public void clear();
  272.  
  273. /**
  274. * 创建Criteria实例
  275. */
  276. public Criteria createCriteria();
  277.  
  278. /**
  279. * 根据Criterion条件创建Criteria
  280. * @param criterions
  281. * @return Criteria
  282. */
  283. public Criteria createCriteria(Criterion... criterions);
  284.  
  285. /**
  286. * 分页查询Criteria
  287. * @param criteria
  288. * @param pageNo 下页页码
  289. * @param pageSize 页面数据量
  290. * @return List<T>
  291. */
  292. public List<T> findPage(Criteria criteria, int pageNo, int pageSize);
  293.  
  294. /**
  295. * 分页查询Criteria
  296. * @param criteria
  297. * @param pageNo
  298. * @param pageSize
  299. * @return PageInfo<T>
  300. * @throws SecurityException
  301. * @throws NoSuchFieldException
  302. * @throws IllegalAccessException
  303. * @throws IllegalArgumentException
  304. */
  305. public PageInfo<T> findQuery(Criteria criteria, int pageNo, int pageSize);
  306.  
  307. /**
  308. *
  309. * @param hql
  310. * @param pageNo
  311. * @param pageSize
  312. * @param map
  313. * @return List<T>
  314. */
  315. public List<T> findQuery(String hql, int pageNo, int pageSize, Map<?, ?> map);
  316.  
  317. }

GenericDaoImpl.java

  1. package com.sxd.dao.impl;
  2.  
  3. import java.io.Serializable;
  4. import java.lang.reflect.Field;
  5. import java.util.ArrayList;
  6. import java.util.Collection;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Map.Entry;
  10.  
  11. import org.hibernate.Criteria;
  12. import org.hibernate.Query;
  13. import org.hibernate.QueryException;
  14. import org.hibernate.ScrollableResults;
  15. import org.hibernate.Session;
  16. import org.hibernate.SessionFactory;
  17. import org.hibernate.criterion.CriteriaSpecification;
  18. import org.hibernate.criterion.Criterion;
  19. import org.hibernate.criterion.DetachedCriteria;
  20. import org.hibernate.criterion.Order;
  21. import org.hibernate.criterion.Projections;
  22. import org.hibernate.criterion.Restrictions;
  23. import org.hibernate.internal.CriteriaImpl;
  24. import org.hibernate.internal.CriteriaImpl.Subcriteria;
  25. import org.hibernate.transform.Transformers;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import org.springframework.util.Assert;
  29.  
  30. import java.lang.reflect.ParameterizedType;
  31.  
  32. import com.github.pagehelper.PageInfo;
  33. import com.sxd.dao.GenericDao;
  34.  
  35. public class GenericDaoImpl<T, PK extends Serializable> implements GenericDao<T, PK> {
  36. /**
  37. * 不建议直接使用
  38. */
  39. @Autowired
  40. private SessionFactory sessionFactory;
  41.  
  42. public Session getSession() {
  43. // 需要开启事物,才能得到CurrentSession
  44. return sessionFactory.getCurrentSession();
  45. }
  46.  
  47. protected Class<T> entityClass;
  48.  
  49. protected Class getEntityClass() {
  50. if (entityClass == null) {
  51. if(((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments().length > 0) {
  52. entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  53. }
  54. }
  55. return entityClass;
  56. }
  57.  
  58. public SessionFactory getSessionFactory() {
  59. return sessionFactory;
  60. }
  61.  
  62. public void setSessionFactory(SessionFactory sessionFactory) {
  63. this.sessionFactory = sessionFactory;
  64. }
  65.  
  66. @Override
  67. public Criteria createCriteria() {
  68. return getSession().createCriteria(getEntityClass());
  69. }
  70.  
  71. @Override
  72. public void save(T t) {
  73. this.getSession().save(t);
  74. }
  75.  
  76. @Override
  77. public void saveOrUpdate(T t) {
  78. Assert.notNull(t);
  79. this.getSession().saveOrUpdate(t);
  80. }
  81.  
  82. @Override
  83. public T load(PK id) {
  84. Assert.notNull(id);
  85. T load = (T) this.getSession().load(getEntityClass(), id);
  86. return load;
  87. }
  88.  
  89. @Override
  90. public T get(PK id) {
  91. T load = (T) this.getSession().get(getEntityClass(), id);
  92. return load;
  93. }
  94.  
  95. @Override
  96. public boolean contains(T t) {
  97. Assert.notNull(t);
  98. return this.getSession().contains(t);
  99. }
  100.  
  101. @Override
  102. public void delete(T t) {
  103. Assert.notNull(t);
  104. this.getSession().delete(t);
  105. }
  106.  
  107. @Override
  108. public boolean deleteById(PK Id) {
  109. Assert.notNull(Id);
  110. T t = get(Id);
  111. if (t == null) return false;
  112. delete(t);
  113. return true;
  114. }
  115.  
  116. @Override
  117. public void deleteAll(Collection<T> entities) {
  118. Assert.notNull(entities);
  119. for (Object entity : entities) {
  120. this.getSession().delete(entity);
  121. }
  122. }
  123.  
  124. @Override
  125. public void queryHql(String hqlString, Object... values) {
  126. Query query = this.getSession().createQuery(hqlString);
  127. if (values != null) {
  128. for (int i = 0; i < values.length; i++) {
  129. query.setParameter(i, values[i]);
  130. }
  131. }
  132. query.executeUpdate();
  133. }
  134.  
  135. /**
  136. * 根据hql 和 map集合中的数据 进行相对应的 insert update delete操作
  137. * @param hqlString
  138. * @param paras
  139. */
  140. public void queryHql(String hqlString, Map<String, Object> paras) {
  141. Query query = this.getSession().createQuery(hqlString);
  142. if (paras != null) {
  143. for (Entry<String, Object> en : paras.entrySet()) {
  144. query.setParameter(en.getKey(), en.getValue());
  145. }
  146. }
  147. query.executeUpdate();
  148. }
  149.  
  150. @Override
  151. public void querySql(String sqlString, Object... values) {
  152. Query query = this.getSession().createSQLQuery(sqlString);
  153. if (values != null) {
  154. for (int i = 0; i < values.length; i++) {
  155. query.setParameter(i, values[i]);
  156. }
  157. }
  158. query.executeUpdate();
  159. }
  160.  
  161. @Override
  162. public T getByHQL(String hqlString, Object... values) {
  163. Query query = this.getSession().createQuery(hqlString);
  164. if (values != null) {
  165. for (int i = 0; i < values.length; i++) {
  166. query.setParameter(i, values[i]);
  167. }
  168. }
  169. return (T) query.uniqueResult();
  170. }
  171.  
  172. @Override
  173. public List<T> getListByHQL(String hqlString, Object... values) {
  174. Query query = this.getSession().createQuery(hqlString);
  175. if (values != null) {
  176. for (int i = 0; i < values.length; i++) {
  177. query.setParameter(i, values[i]);
  178. }
  179. }
  180. return query.list();
  181. }
  182.  
  183. @Override
  184. public List<T> getListBySQL(String sqlString,Class c, Object... values) {
  185. Query query = this.getSession().createSQLQuery(sqlString);
  186. if (values != null) {
  187. for (int i = 0; i < values.length; i++) {
  188. query.setParameter(i, values[i]);
  189. }
  190. }
  191. query.setResultTransformer(Transformers.aliasToBean(c));
  192. return query.list();
  193. }
  194.  
  195. @Override
  196. public void refresh(T t) {
  197. this.getSession().refresh(t);
  198. }
  199.  
  200. @Override
  201. public void update(T t) {
  202. this.getSession().update(t);
  203. }
  204.  
  205. @Override
  206. public Long countByHql(String hql, Object... values) {
  207. Query query = this.getSession().createQuery(hql);
  208. if (values != null) {
  209. for (int i = 0; i < values.length; i++) {
  210. query.setParameter(i, values[i]);
  211. }
  212. }
  213. return (Long) query.uniqueResult();
  214. }
  215.  
  216. @Override
  217. public PageInfo<T> findPageByHql(String hql, String countHql, int pageNo, int pageSize, Object... values) {
  218. PageInfo<T> retValue = new PageInfo<T>();
  219. Query query = this.getSession().createQuery(hql);
  220. if (values != null) {
  221. for (int i = 0; i < values.length; i++) {
  222. query.setParameter(i, values[i]);
  223. }
  224. }
  225. int currentPage = pageNo > 1 ? pageNo : 1;
  226. retValue.setPages(currentPage);
  227. retValue.setPageSize(pageSize);
  228. if (countHql == null) {
  229. ScrollableResults results = query.scroll();
  230. results.last();
  231. retValue.setTotal(results.getRowNumber() + 1);
  232. } else {
  233. Long count = countByHql(countHql, values);
  234. retValue.setTotal(count.intValue());
  235. }
  236. List<T> itemList = query.setFirstResult((currentPage - 1) * pageSize).setMaxResults(pageSize).list();
  237. if (itemList == null) {
  238. itemList = new ArrayList<T>();
  239. }
  240. retValue.setList(itemList);
  241. return retValue;
  242. }
  243.  
  244. @Override
  245. public void merge(T entity) {
  246. // TODO Auto-generated method stub
  247. getSession().merge(entity);
  248. }
  249.  
  250. @Override
  251. public boolean exists(PK id) {
  252. return null != get(id);
  253. }
  254.  
  255. @Override
  256. public int countAll() {
  257. Criteria criteria = createCriteria();
  258. return Integer.valueOf(criteria.setProjection(Projections.rowCount()).uniqueResult().toString());
  259. }
  260.  
  261. @Override
  262. public int countAll(Criteria criteria) {
  263. criteria.setProjection(null);
  264. return Integer.valueOf(criteria.setProjection(Projections.rowCount()).uniqueResult().toString());
  265. }
  266.  
  267. @Override
  268. public List<T> list(Criteria criteria) {
  269. return criteria.list();
  270. }
  271.  
  272. @Override
  273. public List<T> list(DetachedCriteria criteria) {
  274. return (List<T>) list(criteria.getExecutableCriteria(getSession()));
  275. }
  276.  
  277. @Override
  278. public List<T> list(String orderBy, boolean isAsc) {
  279. Criteria criteria = createCriteria();
  280. if (isAsc) {
  281. criteria.addOrder(Order.asc(orderBy));
  282. } else {
  283. criteria.addOrder(Order.desc(orderBy));
  284. }
  285. return criteria.list();
  286. }
  287.  
  288. @Override
  289. public List<T> list(String propertyName, Object value) {
  290. Criterion criterion = Restrictions.like(propertyName, "%"+ value +"%");
  291. return list(criterion);
  292. }
  293.  
  294. @Override
  295. public List<T> list(Criterion criterion) {
  296. Criteria criteria = createCriteria();
  297. criteria.add(criterion);
  298. return criteria.list();
  299. }
  300.  
  301. @Override
  302. public List<T> list(Criterion... criterions) {
  303. return createCriteria(criterions).list();
  304. }
  305.  
  306. @Override
  307. public T uniqueResult(String propertyName, Object value) {
  308. Criterion criterion = Restrictions.eq(propertyName, value);
  309. return (T) createCriteria(criterion).uniqueResult();
  310. }
  311.  
  312. @Override
  313. public T uniqueResult(Criterion... criterions) {
  314. Criteria criteria = createCriteria(criterions);
  315. return uniqueResult(criteria);
  316. }
  317.  
  318. @Override
  319. public T uniqueResult(Criteria criteria) {
  320. return (T) criteria.uniqueResult();
  321. }
  322.  
  323. @Override
  324. public Integer uniqueResultInt(Criteria criteria) {
  325. return (Integer) criteria.uniqueResult();
  326. }
  327.  
  328. @Override
  329. public Criteria distinct(Criteria criteria) {
  330. criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
  331. return criteria;
  332. }
  333.  
  334. @Override
  335. public void flush() {
  336. getSession().flush();
  337. }
  338.  
  339. @Override
  340. public void clear() {
  341. getSession().clear();
  342. }
  343.  
  344. @Override
  345. public Criteria createCriteria(Criterion... criterions) {
  346. Criteria criteria = createCriteria();
  347. for (Criterion c : criterions) {
  348. criteria.add(c);
  349. }
  350. return criteria;
  351. }
  352.  
  353. @Override
  354. public List<T> findPage(Criteria criteria, int pageNo, int pageSize) {
  355. criteria.setFirstResult((pageNo - 1) * pageSize);
  356. criteria.setMaxResults(pageSize);
  357. return list(criteria);
  358. }
  359.  
  360. @Override
  361. public PageInfo<T> findQuery(Criteria criteria, int pageNo, int pageSize) {
  362. try {
  363. Assert.isTrue(pageNo >= 1, "pageNO should start from 1");
  364. while(criteria instanceof Subcriteria){
  365. criteria = ((Subcriteria)criteria).getParent();
  366. }
  367. //拆分order by子句
  368. while(criteria instanceof Subcriteria){
  369. criteria = ((Subcriteria)criteria).getParent();
  370. }
  371. Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
  372. field.setAccessible(true);
  373. List<?> orderEntrys = (List<?>) field.get(criteria);
  374. field.set(criteria, new ArrayList());
  375. //统计总数
  376. long totalCount = countAll(criteria);
  377. criteria.setProjection(null);
  378. //统计完了再把order by子句加上 这样保证了sql语句不会出错
  379. field.set(criteria, orderEntrys);
  380. List<T> list = findPage(criteria, pageNo, pageSize);
  381. if (totalCount < 1) {
  382. return new PageInfo<T>();
  383. }
  384. PageInfo<T> page = new PageInfo<T>();
  385. page.setPageNum(pageNo);
  386. page.setTotal(totalCount);
  387. page.setPages((int) (totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1));
  388. page.setPageSize(pageSize);
  389. page.setList(list);
  390. return page;
  391. } catch (Exception e) {
  392. // TODO: handle exception
  393. e.printStackTrace();
  394. throw new QueryException("查询出错!");
  395. }
  396.  
  397. }
  398.  
  399. @Override
  400. public List<T> findQuery(String hql, int pageNo, int pageSize, Map<?, ?> map) {
  401. // TODO Auto-generated method stub
  402. if(null == hql) return null;
  403. Query query = getSession().createQuery(hql);
  404. for (Entry<?, ?> en : map.entrySet()) {
  405. query.setParameter(en.getKey().toString(), en.getValue());
  406. }
  407. if(pageNo > 0) query.setFirstResult(pageNo);
  408. if(pageSize > 0) query.setFirstResult(pageSize);
  409. return query.list();
  410. }
  411.  
  412. @Override
  413. public List<T> findAll() {
  414. // TODO Auto-generated method stub
  415. return createCriteria().list();
  416. }
  417. }

GenericService.java

  1. package com.sxd.service;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.hibernate.Criteria;
  9. import org.hibernate.criterion.Criterion;
  10. import org.hibernate.criterion.DetachedCriteria;
  11.  
  12. import com.github.pagehelper.PageInfo;
  13.  
  14. public interface GenericService<T, PK extends Serializable> {
  15. /**
  16. * 查询全部,可以排序
  17. * @param orderBy
  18. * @param isAsc
  19. * @return List<T>
  20. */
  21. public List<T> list(Criteria criteria);
  22.  
  23. /**
  24. * 查询全部,可以排序
  25. * @param orderBy
  26. * @param isAsc
  27. * @return List<T>
  28. */
  29. public List<T> list(String orderBy, boolean isAsc);
  30.  
  31. /**
  32. * 离线查询
  33. * @param criteria
  34. * @return List<T>
  35. */
  36. public List<T> list(DetachedCriteria criteria);
  37.  
  38. /**
  39. * 根据Criteria查询条件,获取总数
  40. * @param criteria
  41. * @return int
  42. * @throws SecurityException
  43. * @throws NoSuchFieldException
  44. * @throws IllegalAccessException
  45. * @throws IllegalArgumentException
  46. */
  47. public int countAll(Criteria criteria);
  48.  
  49. /**
  50. * 获取总数(默认为entityClass) 即查询总条数
  51. * @return int
  52. */
  53. public int countAll();
  54.  
  55. /**
  56. * 根据I判断是否存在
  57. * @param id
  58. * @return boolean
  59. */
  60. public boolean exists(PK id);
  61.  
  62. /**
  63. * 保存实体
  64. * @param t 实体参数
  65. */
  66. public void save(T t);
  67.  
  68. /**
  69. * 保存或者更新实体
  70. * @param t 实体
  71. */
  72. public void saveOrUpdate(T t);
  73.  
  74. /**
  75. * 加载实体的通过load方法
  76. * @param id 实体的id
  77. * @return 查询出来的实体
  78. */
  79. public T load(PK id);
  80.  
  81. /**
  82. * 合并实体
  83. * @param entity
  84. */
  85. public void merge(T entity);
  86.  
  87. /**
  88. * 查找全部
  89. */
  90. public List<T> findAll();
  91.  
  92. /**
  93. * 通过get方法加载实体的
  94. * @param id 实体的id
  95. * @return 查询出来的实体
  96. */
  97. public T get(PK id);
  98.  
  99. /**
  100. * contains
  101. * @param t 实体
  102. * @return 是否包含
  103. */
  104. public boolean contains(T t);
  105.  
  106. /**
  107. * delete
  108. * @param t
  109. * 删除实体
  110. */
  111. public void delete(T t);
  112.  
  113. /**
  114. * 根据ID删除数据
  115. * @param Id 实体id
  116. * @return 是否删除成功
  117. */
  118. public boolean deleteById(PK Id);
  119.  
  120. /**
  121. * 删除所有
  122. * @param entities 实体的Collection集合
  123. */
  124. public void deleteAll(Collection<T> entities);
  125.  
  126. /**
  127. * 执行Hql语句 要求 hql中参数顺序与可变参数 中参数顺序相一致
  128. * @param hqlString hql
  129. * @param values 不定参数数组
  130. */
  131. public void queryHql(String hqlString, Object... values);
  132.  
  133. /**
  134. * 执行Sql语句(不建议用,影响扩展)
  135. * @param sqlString sql
  136. * @param values 不定参数数组
  137. */
  138. public void querySql(String sqlString, Object... values);
  139.  
  140. /**
  141. * 根据HQL语句查找唯一实体
  142. *
  143. * @param hqlString HQL语句
  144. * @param values 不定参数的Object数组
  145. * @return 查询实体
  146. */
  147. public T getByHQL(String hqlString, Object... values);
  148.  
  149. /**
  150. * 根据SQL语句查找唯一实体(不建议用,影响扩展)
  151. * @param sqlString SQL语句
  152. * @param values 不定参数的Object数组
  153. * @return 查询实体
  154. */
  155.  
  156. /**
  157. * 根据HQL语句,得到对应的list
  158. * @param hqlString HQL语句
  159. * @param values 不定参数的Object数组
  160. * @return 查询多个实体的List集合
  161. */
  162. public List<T> getListByHQL(String hqlString, Object... values);
  163.  
  164. /**
  165. * 根据SQL语句,得到对应的list(不建议用,影响扩展)
  166. * @param sqlString HQL语句
  167. * @param values 不定参数的Object数组
  168. * @return 查询多个实体的List集合
  169. */
  170. public List<T> getListBySQL(String sqlString,Class c, Object... values);
  171.  
  172. /**
  173. * refresh 刷新实体,强制与数据库两步 refresh方法应该是数据库的数据更新到本地的person实体中,而不是本地person更新数据到数据库中 也就是执行refresh方法是更新了java代码中变量的数据值
  174. * @param t 实体
  175. */
  176. public void refresh(T t);
  177.  
  178. /**
  179. * update
  180. * @param t
  181. * 更新的是数据库中的数据
  182. */
  183. public void update(T t);
  184.  
  185. /**
  186. * 根据HQL得到记录数
  187. * @param hql HQL语句
  188. * @param values 不定参数的Object数组
  189. * @return 记录总数
  190. */
  191. public Long countByHql(String hql, Object... values);
  192.  
  193. /**
  194. * HQL分页查询
  195. *
  196. * @param hql HQL语句
  197. * @param countHql 查询记录条数的HQL语句
  198. * @param pageNo 下一页
  199. * @param pageSize 一页总条数
  200. * @param values 不定Object数组参数
  201. * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合
  202. */
  203. public PageInfo<T> findPageByHql(String hql, String countHql, int pageNo, int pageSize, Object... values);
  204.  
  205. /**
  206. * 按属性查找对象列表,匹配方式为相等
  207. * @param propertyName
  208. * @param value
  209. * @return List<T>
  210. */
  211. public List<T> list(String propertyName, Object value);
  212.  
  213. /**
  214. * 根据criterion查询条件获取数据列表
  215. * @param criterion
  216. * @return List<T>
  217. */
  218. public List<T> list(Criterion criterion);
  219.  
  220. /**
  221. * 按Criteria查询对象列表
  222. * @param criterions
  223. * @return List<T>
  224. */
  225. public List<T> list(Criterion... criterions);
  226.  
  227. /**
  228. * 按属性查找唯一对象,匹配方式为相等
  229. * @param propertyName
  230. * @param value
  231. * @return T
  232. */
  233. public T uniqueResult(String propertyName, Object value);
  234.  
  235. /**
  236. * 按Criteria查询唯一对象
  237. * @param criterions
  238. * @return T
  239. */
  240. public T uniqueResult(Criterion... criterions);
  241.  
  242. /**
  243. * 按Criteria查询唯一对象
  244. * @param criteria
  245. * @return T
  246. */
  247. public T uniqueResult(Criteria criteria);
  248. /**
  249. * 按照criteria返回类型为Integer类型的某个字段的值
  250. * @param criteria
  251. * @return
  252. */
  253. public Integer uniqueResultInt(Criteria criteria);
  254.  
  255. /**
  256. * 为Criteria添加distinct transformer
  257. * @param criteria
  258. * @return Criteria
  259. */
  260. public Criteria distinct(Criteria criteria);
  261.  
  262. /**
  263. * 刷新session
  264. */
  265. public void flush();
  266.  
  267. /**
  268. * 清空session
  269. */
  270. public void clear();
  271.  
  272. /**
  273. * 创建Criteria实例
  274. */
  275. public Criteria createCriteria();
  276.  
  277. /**
  278. * 根据Criterion条件创建Criteria
  279. * @param criterions
  280. * @return Criteria
  281. */
  282. public Criteria createCriteria(Criterion... criterions);
  283.  
  284. /**
  285. * 分页查询Criteria
  286. * @param criteria
  287. * @param pageNo 下页页码
  288. * @param pageSize 页面数据量
  289. * @return List<T>
  290. */
  291. public List<T> findPage(Criteria criteria, int pageNo, int pageSize);
  292.  
  293. /**
  294. * 分页查询Criteria
  295. * @param criteria
  296. * @param pageNo
  297. * @param pageSize
  298. * @return PageInfo<T>
  299. * @throws SecurityException
  300. * @throws NoSuchFieldException
  301. * @throws IllegalAccessException
  302. * @throws IllegalArgumentException
  303. */
  304. public PageInfo<T> findQuery(Criteria criteria, int pageNo, int pageSize);
  305.  
  306. /**
  307. *
  308. * @param hql
  309. * @param pageNo
  310. * @param pageSize
  311. * @param map
  312. * @return List<T>
  313. */
  314. public List<T> findQuery(String hql, int pageNo, int pageSize, Map<?, ?> map);
  315.  
  316. }

GenericServiceImpl.java

  1. package com.sxd.service.impl;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.hibernate.Criteria;
  9. import org.hibernate.criterion.Criterion;
  10. import org.hibernate.criterion.DetachedCriteria;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.transaction.annotation.Propagation;
  15. import org.springframework.transaction.annotation.Transactional;
  16.  
  17. import com.github.pagehelper.PageInfo;
  18. import com.sxd.dao.impl.GenericDaoImpl;
  19. import com.sxd.service.GenericService;
  20.  
  21. @Transactional
  22. public class GenericServiceImpl<T, PK extends Serializable> implements GenericService<T, PK> {
  23.  
  24. private GenericDaoImpl<T, PK> dao;
  25. /**
  26. * 设值注入Dao
  27. * @param dao
  28. */
  29. @Autowired
  30. public void setDao(GenericDaoImpl<T, PK> dao) {
  31. this.dao = dao;
  32. }
  33.  
  34. @Override
  35. @Transactional(propagation = Propagation.REQUIRED)
  36. public List<T> list(Criteria criteria) {
  37. // TODO Auto-generated method stub
  38. return dao.list(criteria);
  39. }
  40.  
  41. @Override
  42. public List<T> list(String orderBy, boolean isAsc) {
  43. // TODO Auto-generated method stub
  44. return dao.list(orderBy, isAsc);
  45. }
  46.  
  47. @Override
  48. public List<T> list(DetachedCriteria criteria) {
  49. // TODO Auto-generated method stub
  50. return dao.list(criteria);
  51. }
  52.  
  53. @Override
  54. public int countAll(Criteria criteria) {
  55. // TODO Auto-generated method stub
  56. return dao.countAll(criteria);
  57. }
  58.  
  59. @Override
  60. public int countAll() {
  61. // TODO Auto-generated method stub
  62. return dao.countAll();
  63. }
  64.  
  65. @Override
  66. public boolean exists(PK id) {
  67. // TODO Auto-generated method stub
  68. return dao.exists(id);
  69. }
  70.  
  71. @Override
  72. @Transactional(propagation = Propagation.REQUIRED)
  73. public void save(T t) {
  74. // TODO Auto-generated method stub
  75. dao.save(t);
  76. }
  77.  
  78. @Override
  79. @Transactional(propagation = Propagation.REQUIRED)
  80. public void saveOrUpdate(T t) {
  81. // TODO Auto-generated method stub
  82. dao.saveOrUpdate(t);
  83. }
  84.  
  85. @Override
  86. @Transactional(propagation = Propagation.REQUIRED)
  87. public T load(PK id) {
  88. // TODO Auto-generated method stub
  89. return dao.load(id);
  90. }
  91.  
  92. @Override
  93. @Transactional(propagation = Propagation.REQUIRED)
  94. public void merge(T entity) {
  95. // TODO Auto-generated method stub
  96. dao.merge(entity);
  97. }
  98.  
  99. @Override
  100. @Transactional(propagation = Propagation.REQUIRES_NEW)
  101. public List<T> findAll() {
  102. // TODO Auto-generated method stub
  103. return dao.findAll();
  104. }
  105.  
  106. @Override
  107. @Transactional(propagation = Propagation.REQUIRED)
  108. public T get(PK id) {
  109. // TODO Auto-generated method stub
  110. return dao.get(id);
  111. }
  112.  
  113. @Override
  114. public boolean contains(T t) {
  115. // TODO Auto-generated method stub
  116. return dao.contains(t);
  117. }
  118.  
  119. @Override
  120. public void delete(T t) {
  121. // TODO Auto-generated method stub
  122. dao.delete(t);
  123. }
  124.  
  125. @Override
  126. @Transactional(propagation = Propagation.REQUIRED)
  127. public boolean deleteById(PK Id) {
  128. // TODO Auto-generated method stub
  129. return dao.deleteById(Id);
  130. }
  131.  
  132. @Override
  133. @Transactional(propagation = Propagation.REQUIRED)
  134. public void deleteAll(Collection<T> entities) {
  135. // TODO Auto-generated method stub
  136. dao.deleteAll(entities);
  137. }
  138.  
  139. @Override
  140. public void queryHql(String hqlString, Object... values) {
  141. // TODO Auto-generated method stub
  142. dao.queryHql(hqlString, values);
  143. }
  144.  
  145. @Override
  146. public void querySql(String sqlString, Object... values) {
  147. // TODO Auto-generated method stub
  148. dao.querySql(sqlString, values);
  149. }
  150.  
  151. @Override
  152. public T getByHQL(String hqlString, Object... values) {
  153. // TODO Auto-generated method stub
  154. return dao.getByHQL(hqlString, values);
  155. }
  156.  
  157. @Override
  158. public List<T> getListByHQL(String hqlString, Object... values) {
  159. // TODO Auto-generated method stub
  160. return dao.getListByHQL(hqlString, values);
  161. }
  162.  
  163. @Override
  164. public List<T> getListBySQL(String sqlString,Class c, Object... values) {
  165. // TODO Auto-generated method stub
  166. return dao.getListBySQL(sqlString, c, values);
  167. }
  168.  
  169. @Override
  170. public void refresh(T t) {
  171. // TODO Auto-generated method stub
  172. dao.refresh(t);
  173. }
  174.  
  175. @Override
  176. @Transactional(propagation = Propagation.REQUIRED)
  177. public void update(T t) {
  178. // TODO Auto-generated method stub
  179. dao.update(t);
  180. }
  181.  
  182. @Override
  183. public Long countByHql(String hql, Object... values) {
  184. // TODO Auto-generated method stub
  185. return dao.countByHql(hql, values);
  186. }
  187.  
  188. @Override
  189. public PageInfo<T> findPageByHql(String hql, String countHql, int pageNo,
  190. int pageSize, Object... values) {
  191. // TODO Auto-generated method stub
  192. return dao.findPageByHql(hql, countHql, pageNo, pageSize, values);
  193. }
  194.  
  195. @Override
  196. public List<T> list(String propertyName, Object value) {
  197. // TODO Auto-generated method stub
  198. return dao.list(propertyName, value);
  199. }
  200.  
  201. @Override
  202. public List<T> list(Criterion criterion) {
  203. // TODO Auto-generated method stub
  204. return dao.list(criterion);
  205. }
  206.  
  207. @Override
  208. public List<T> list(Criterion... criterions) {
  209. // TODO Auto-generated method stub
  210. return dao.list(criterions);
  211. }
  212.  
  213. @Override
  214. public T uniqueResult(String propertyName, Object value) {
  215. // TODO Auto-generated method stub
  216. return dao.uniqueResult(propertyName, value);
  217. }
  218.  
  219. @Override
  220. public T uniqueResult(Criterion... criterions) {
  221. // TODO Auto-generated method stub
  222. return dao.uniqueResult(criterions);
  223. }
  224.  
  225. @Override
  226. @Transactional(propagation = Propagation.REQUIRED, readOnly = true)
  227. public T uniqueResult(Criteria criteria) {
  228. // TODO Auto-generated method stub
  229. return dao.uniqueResult(criteria);
  230. }
  231.  
  232. @Override
  233. @Transactional(propagation = Propagation.REQUIRED, readOnly = true)
  234. public Integer uniqueResultInt(Criteria criteria){
  235. return dao.uniqueResultInt(criteria);
  236. }
  237.  
  238. @Override
  239. public Criteria distinct(Criteria criteria) {
  240. // TODO Auto-generated method stub
  241. return dao.distinct(criteria);
  242. }
  243.  
  244. @Override
  245. public void flush() {
  246. // TODO Auto-generated method stub
  247. dao.flush();
  248. }
  249.  
  250. @Override
  251. public void clear() {
  252. // TODO Auto-generated method stub
  253. dao.clear();
  254. }
  255.  
  256. @Override
  257. public Criteria createCriteria() {
  258. // TODO Auto-generated method stub
  259. return dao.createCriteria();
  260. }
  261.  
  262. @Override
  263. public Criteria createCriteria(Criterion... criterions) {
  264. // TODO Auto-generated method stub
  265. return dao.createCriteria(criterions);
  266. }
  267.  
  268. @Override
  269. public List<T> findPage(Criteria criteria, int pageNo, int pageSize) {
  270. // TODO Auto-generated method stub
  271. return dao.findPage(criteria, pageNo, pageSize);
  272. }
  273.  
  274. @Override
  275. public PageInfo<T> findQuery(Criteria criteria, int pageNo, int pageSize) {
  276. // TODO Auto-generated method stub
  277. return dao.findQuery(criteria, pageNo, pageSize);
  278. }
  279.  
  280. @Override
  281. public List<T> findQuery(String hql, int pageNo, int pageSize, Map<?, ?> map) {
  282. // TODO Auto-generated method stub
  283. return dao.findQuery(hql, pageNo, pageSize, map);
  284. }
  285.  
  286. }

使用工具类生成实体的Dao/Service

CreateJava.java

  1. package com.sxd.utils;
  2.  
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6.  
  7. import org.junit.Test;
  8.  
  9. public class CreateJava {
  10.  
  11. @Test
  12. public void justCreateJava() throws IOException{
  13. File file = new File("F:/workspace2/shiro-first/src/main/java/com/sxd/entity");
  14. File []list = file.listFiles();
  15. for (File file2 : list) {
  16. String fileName = file2.getName().substring(0,file2.getName().lastIndexOf("."));
  17. createDao(fileName);
  18. createDaoImpl(fileName);
  19. createService(fileName);
  20. createServiceImpl(fileName);
  21. }
  22. }
  23. /**
  24. * 创建Dao层
  25. * @param fileName
  26. * @throws IOException
  27. */
  28. public void createDao(String fileName) throws IOException{
  29. //拼接 DaoImpl内容
  30. String content = "package com.sxd.dao;\r\n"
  31. + "\r\n"
  32. + "import com.sxd.entity."+fileName+";\r\n"
  33. + "public interface "+fileName+"Dao extends GenericDao<"+fileName+", String> {\r\n"
  34. + "\r\n"
  35. + "}";
  36.  
  37. //指定将Dao文件生成到对应的指定位置
  38. FileWriter writer = new FileWriter(new File("F:/workspace2/shiro-first/src/main/java/com/sxd/dao/"+fileName+"Dao.java"));
  39. writer.write(content);
  40. writer.close();
  41. }
  42.  
  43. /**
  44. * 创建DaoImpl层
  45. */
  46. public void createDaoImpl(String fileName) throws IOException{
  47. //拼接 DaoImpl内容
  48. String content = "package com.sxd.dao.impl;\r\n"
  49. + "\r\n"
  50. + "import org.springframework.stereotype.Repository;\r\n"
  51. + "import com.sxd.dao."+fileName+"Dao;\r\n"
  52. + "import com.sxd.entity."+fileName+";\r\n"
  53. + "@Repository \r\n"
  54. + "public class "+fileName+"DaoImpl extends GenericDaoImpl<"+fileName+", String> implements "+fileName+"Dao {\r\n"
  55. + "\r\n"
  56. + "}";
  57.  
  58. //指定将DaoImpl文件生成到对应的指定位置
  59. FileWriter writer = new FileWriter(new File("F:/workspace2/shiro-first/src/main/java/com/sxd/dao/impl/"+fileName+"DaoImpl.java"));
  60. writer.write(content);
  61. writer.close();
  62. }
  63.  
  64. /**
  65. * 创建 Service层
  66. * @param fileName
  67. * @throws IOException
  68. */
  69. public void createService(String fileName) throws IOException{
  70. //拼接Service内容
  71. String content = "package com.sxd.service;\r\n"
  72. + "import com.sxd.entity."+fileName+";\r\n"
  73. + "public interface "+fileName+"Service extends GenericService<"+fileName+", String> {\r\n"
  74. + "\r\n"
  75. + "}";
  76.  
  77. FileWriter writer = new FileWriter(new File("F:/workspace2/shiro-first/src/main/java/com/sxd/service/"+fileName+"Service.java"));
  78. writer.write(content);
  79. writer.close();
  80. }
  81.  
  82. /**
  83. * 创建ServiceImpl
  84. * @throws IOException
  85. */
  86. public void createServiceImpl(String fileName) throws IOException{
  87. //拼接Service内容
  88. String content = "package com.sxd.service.impl;\r\n"
  89. + "import org.springframework.beans.factory.annotation.Autowired;\r\n"
  90. + "import org.springframework.stereotype.Service;\r\n"
  91. + "import com.sxd.dao."+fileName+"Dao;\r\n"
  92. + "import com.sxd.entity."+fileName+";\r\n"
  93. + "import com.sxd.service."+fileName+"Service;\r\n"
  94. + "@Service \r\n"
  95. + "public class "+fileName+"ServiceImpl extends GenericServiceImpl<"+fileName+", String> implements "+fileName+"Service {\r\n"
  96. + "\r\n"
  97. + "@Autowired\r\n"
  98. + "private "+fileName+"Dao dao;\r\n"
  99. + "}";
  100. FileWriter writer = new FileWriter(new File("F:/workspace2/shiro-first/src/main/java/com/sxd/service/impl/"+fileName+"ServiceImpl.java"));
  101. writer.write(content);
  102. writer.close();
  103. }
  104.  
  105. }

6.配置spring+hibernate+shiro+springMVC的配置文件

config.properties

  1. #application configs
  2.  
  3. #jdbc c3p0 config
  4. jdbc.driver = com.mysql.jdbc.Driver
  5. jdbc.url = jdbc\:mysql\://localhost\:3306/shiros?useUnicode\=true&characterEncoding\=utf-8
  6. jdbc.username = root
  7. jdbc.password = root
  8.  
  9. #hibernate config
  10. hibernate.dialect = org.hibernate.dialect.MySQLDialect
  11. hibernate.show_sql = true
  12. hibernate.format_sql = false
  13. hibernate.hbm2ddl.auto = update
  14. hibernate.cache.use_second_level_cache = true
  15. hibernate.cache.use_query_cache = true
  16. hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory
  17. hibernate.cache.provider_configuration_file_resource_path =ehcache.xml

ehcache.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
  3. <diskStore path="D:/ehcache" />
  4. <!-- DefaultCache setting. -->
  5. <defaultCache
  6. maxElementsInMemory="1000"
  7. eternal="false"
  8. timeToIdleSeconds="120"
  9. timeToLiveSeconds="120"
  10. maxElementsOnDisk="1000000"
  11. overflowToDisk="true"
  12. memoryStoreEvictionPolicy="LRU">
  13.  
  14. </defaultCache>
  15.  
  16. <!-- Special objects setting. -->
  17.  
  18. <cache
  19. name="org.andy.work.entity.AcctUser"
  20. maxElementsInMemory="2"
  21. memoryStoreEvictionPolicy="LRU"
  22. eternal="true"
  23. diskPersistent="false"
  24. overflowToDisk="false"
  25. maxElementsOnDisk="1000000" />
  26.  
  27. </ehcache>

log4j.properties

  1. ### set log levels ###
  2. log4j.rootLogger = INFO , C , D , E
  3.  
  4. ### console ###
  5. log4j.appender.C = org.apache.log4j.ConsoleAppender
  6. log4j.appender.C.Target = System.out
  7. log4j.appender.C.layout = org.apache.log4j.PatternLayout
  8. log4j.appender.C.layout.ConversionPattern = [shiro-first][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
  9.  
  10. ### log file ###
  11. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
  12. log4j.appender.D.File = ../logs/springmvc_hibernate_demo.log
  13. log4j.appender.D.Append = true
  14. log4j.appender.D.Threshold = INFO
  15. log4j.appender.D.layout = org.apache.log4j.PatternLayout
  16. log4j.appender.D.layout.ConversionPattern = [shiro-first][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
  17.  
  18. ### exception ###
  19. log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
  20. log4j.appender.E.File = ../logs/biologyInfo_error.log
  21. log4j.appender.E.Append = true
  22. log4j.appender.E.Threshold = ERROR
  23. log4j.appender.E.layout = org.apache.log4j.PatternLayout
  24. log4j.appender.E.layout.ConversionPattern =[shiro-first][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n

spring-hibernate.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xmlns:mvc="http://www.springframework.org/schema/mvc"
  8. xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
  9. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
  10. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  11. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  12. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
  13.  
  14. <!-- 以下为SpringMVC配置 -->
  15. <mvc:annotation-driven>
  16. <!-- 返回json数据,@response使用 -->
  17. <mvc:message-converters register-defaults="true">
  18. <bean
  19. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  20. <property name="supportedMediaTypes">
  21. <list>
  22. <value>text/html;charset=UTF-8</value>
  23. <value>application/json;charset=UTF-8</value>
  24. </list>
  25. </property>
  26.  
  27. </bean>
  28. </mvc:message-converters>
  29. </mvc:annotation-driven>
  30.  
  31. <!-- 自动扫描@Controller注入为bean -->
  32. <context:property-placeholder location="classpath:config.properties"/>
  33. <!-- 自动扫描@Controller注入为bean -->
  34. <context:component-scan base-package="com.agen" />
  35.  
  36. <!-- 标明注解事务 -->
  37. <tx:annotation-driven transaction-manager="transactionManager" />
  38.  
  39. <!-- 配置数据源 c3p0 -->
  40. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
  41. destroy-method="close">
  42. <property name="driverClass" value="${jdbc.driver}" />
  43. <property name="jdbcUrl" value="${jdbc.url}" />
  44. <property name="user" value="${jdbc.username}" />
  45. <property name="password" value="${jdbc.password}" />
  46.  
  47. <!-- 请求超时时间 -->
  48. <property name="checkoutTimeout" value="30000" />
  49. <!-- 每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->
  50. <property name="idleConnectionTestPeriod" value="30" />
  51. <!-- 连接数据库连接池最大空闲时间 -->
  52. <property name="maxIdleTime" value="30" />
  53. <!-- 连接池初始化连接数 -->
  54. <property name="initialPoolSize" value="5" />
  55. <property name="minPoolSize" value="5" />
  56. <property name="maxPoolSize" value="20" />
  57. <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->
  58. <property name="acquireIncrement" value="5" />
  59. </bean>
  60.  
  61. <!-- 配置hibernate的SessionFactory -->
  62. <bean id="sessionFactory"
  63. class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  64. <!-- 注入数据源 相关信息看源码 -->
  65. <property name="dataSource" ref="dataSource" />
  66. <!-- hibernate配置信息 -->
  67. <property name="hibernateProperties">
  68. <props>
  69. <prop key="hibernate.dialect">${hibernate.dialect}</prop>
  70. <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
  71. <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
  72. <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
  73.  
  74. <!-- 开启二级缓存 ehcache -->
  75. <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
  76. <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
  77. <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
  78. <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.cache.provider_configuration_file_resource_path}
  79. </prop>
  80. </props>
  81. </property>
  82. <!-- 扫描hibernate注解配置的entity -->
  83. <property name="packagesToScan" value="com.agen.entity" />
  84. </bean>
  85.  
  86. <!-- 配置事务管理器 -->
  87. <bean id="transactionManager"
  88. class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  89. <property name="sessionFactory" ref="sessionFactory" />
  90. </bean>
  91.  
  92. <!-- 自定义Realm
  93. <bean id="myRealm" class="com.sxd.utils.MyRealm">
  94. <property name="sessionFactory" ref="sessionFactory" />
  95. </bean>-->
  96.  
  97. <!-- 安全管理器 -->
  98. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  99. <property name="realm" ref="myRealm"/>
  100. </bean>
  101.  
  102. <!-- Shiro过滤器 -->
  103. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  104. <!-- Shiro的核心安全接口,这个属性是必须的 -->
  105. <property name="securityManager" ref="securityManager"/>
  106. <!-- 身份认证失败,则跳转到登录页面的配置 -->
  107. <property name="loginUrl" value="/index.jsp"/>
  108. <!-- 权限认证失败,则跳转到指定页面 -->
  109. <property name="unauthorizedUrl" value="/error.jsp"/>
  110. <!-- Shiro连接约束配置,即过滤链的定义 -->
  111. <property name="filterChainDefinitions" ref="filterChainDefinitions" />
  112. </bean>
  113. <bean name="filterChainDefinitions" class="java.lang.String">
  114. <constructor-arg>
  115. <value>
  116. /=anon
  117. /index.jsp=anon
  118. /login/login1.htmls=anon
  119. /login/register.htmls=anon
  120. /js/** = anon
  121. /bootstrap/** = anon
  122. /css/** = anon
  123. /images/** = anon
  124. /layer/** = anon
  125. /lib/** = anon
  126. /skin/** = anon
  127. /temp/** = anon
  128. /upload/** = anon
  129. /**=authc
  130. </value>
  131. </constructor-arg>
  132. </bean>
  133.  
  134. <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
  135. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
  136.  
  137. <!-- 开启Shiro注解 -->
  138. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
  139. <property name="proxyTargetClass" value="true"/>
  140. </bean>
  141. <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
  142. <property name="securityManager" ref="securityManager"/>
  143. </bean>
  144.  
  145. <!-- 自定义异常处理-->
  146. <bean id="exceptionResolver" class="com.agen.util.MyExceptionResolver"></bean>
  147.  
  148. </beans>

着重注意shiro的相关配置:

  1. <!-- 自定义Realm
  2. <bean id="myRealm" class="com.sxd.utils.MyRealm">
  3. <property name="sessionFactory" ref="sessionFactory" />
  4. </bean>-->
  5.  
  6. <!-- 安全管理器 -->
  7. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  8. <property name="realm" ref="myRealm"/>
  9. </bean>
  10.  
  11. <!-- Shiro过滤器 -->
  12. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  13. <!-- Shiro的核心安全接口,这个属性是必须的 -->
  14. <property name="securityManager" ref="securityManager"/>
  15. <!-- 身份认证失败,则跳转到登录页面的配置 -->
  16. <property name="loginUrl" value="/index.jsp"/>
  17. <!-- 权限认证失败,则跳转到指定页面 -->
  18. <property name="unauthorizedUrl" value="/error.jsp"/>
  19. <!-- Shiro连接约束配置,即过滤链的定义 -->
  20. <property name="filterChainDefinitions" ref="filterChainDefinitions" />
  21. </bean>
  22. <bean name="filterChainDefinitions" class="java.lang.String">
  23. <constructor-arg>
  24. <value>
  25. /=anon
  26. /index.jsp=anon
  27. /login/login1.htmls=anon
  28. /login/register.htmls=anon
  29. /js/** = anon
  30. /bootstrap/** = anon
  31. /css/** = anon
  32. /images/** = anon
  33. /layer/** = anon
  34. /lib/** = anon
  35. /skin/** = anon
  36. /temp/** = anon
  37. /upload/** = anon
  38. /**=authc
  39. </value>
  40. </constructor-arg>
  41. </bean>
  42.  
  43. <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
  44. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
  45.  
  46. <!-- 开启Shiro注解 -->
  47. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
  48. <property name="proxyTargetClass" value="true"/>
  49. </bean>
  50. <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
  51. <property name="securityManager" ref="securityManager"/>
  52. </bean>
  53.  
  54. <!-- 自定义异常处理-->
  55. <bean id="exceptionResolver" class="com.agen.util.MyExceptionResolver"></bean>

其中:1>shiro需要开启注解

   2>shiro自定义异常处理【这个自定义的异常处理类需要自己写】

     3>/=anon表示跟路径【http://localhost:8080/shiro-first/】是不拦截的

   4>/index.jsp=anon表示【http://localhost:8080/shiro-first/index.jsp】是不拦截的

   5>/js/** = anon表示【http://localhost:8080/shiro-first/js/jquery.js】这种类型的资源请求都是不拦截的

   6>/**=authc 表示除了上面定义的不拦截之外的其他请求地址均需要被拦截到,被拦截到是需要验证 当前访问这个地址的 用户是否已经通过验证,也就是是否登录过,如果没有,会根据上面配置的<property name="loginUrl" value="/index.jsp"/>跳转指定页面,这里就是指定到登录页面。

   7><property name="unauthorizedUrl" value="/error.jsp"/>如果没有整合使用springMVC跳转页面,那么这个就是有用的,现在页面的跳转交给springMVC来控制,这个权限认证不通过的配置就不起作用了,而是springMVC根据抛出异常,然后根据自定义的异常处理类,跳转到指定的页面了。

   8>

  1. <!-- 自定义Realm
  2. <bean id="myRealm" class="com.sxd.utils.MyRealm">
  3. <property name="sessionFactory" ref="sessionFactory" />
  4. </bean>-->

   自定义的这个Realm相当于咱们自己写的Filter,其中是实现了shiro提供的接口,进行了相对应的处理,拿到了本用户以及本用户所对应的权限,交给shiro自行比较,完成验证。

   9>/login/login.htmls=anon需要加后缀是因为web.xml中的相关配置未拦截到相关的请求页面,仅注意就好

spring-mvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xmlns:aop="http://www.springframework.org/schema/aop"
  9. xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
  10. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
  11. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  12. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  13. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
  14.  
  15. <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
  16. <bean
  17. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  18. <property name="viewClass"
  19. value="org.springframework.web.servlet.view.JstlView" />
  20. <property name="prefix" value="/WEB-INF/views" />
  21. <property name="suffix" value=".jsp" />
  22. </bean>
  23.  
  24. <!-- 实现文件上传,这样一旦某个Request是一个MultipartRequest,它就会首先被MultipartResolver处理,然后再转发相应的Controller -->
  25. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  26. <!-- 设置上传文件的最大尺寸为1GB -->
  27. <!-- <property name="maxUploadSize">
  28. <value>1073741824</value>
  29. </property> -->
  30. </bean>
  31.  
  32. </beans>

7.配置web项目的web.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. id="WebApp_ID" version="2.5">
  6. <!-- web容器是web项目的大脑 -->
  7. <!-- 在web.xml中,执行顺序是:1.先执行listener 2。再执行filter 3.最后执行servlet 这就是执行顺序
  8. 就像spring-hibernate.xml文件是在执行Listener的时候加载的,那注意这几个配置文件在web.xml中的加载顺序,因为资源文件是在配置文件【xml文件】中加载的,肯定是先加载的资源文件【properties文件】,才能在配置文件中调用资源文件中的变量的值使用
  9.  
  10. -->
  11. <display-name>shiro-first</display-name>
  12. <!-- web容器,首先需要引入spring,让spring管理各个框架,并将其注入为bean -->
  13. <!-- 这个相当于定一个 变量在web.xml中,在下面的listener org.springframework.web.context.ContextLoaderListener中,加载这个spring-hibernate.xml文件 -->
  14. <context-param>
  15. <param-name>contextConfigLocation</param-name>
  16. <param-value>classpath:spring-hibernate.xml</param-value>
  17. </context-param>
  18.  
  19. <!-- 编码过滤器 配置控制层的filter信息 -->
  20. <filter>
  21. <filter-name>encodingFilter</filter-name>
  22. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  23. <init-param>
  24. <param-name>encoding</param-name>
  25. <param-value>utf-8</param-value>
  26. </init-param>
  27. <init-param>
  28. <param-name>forceEncoding</param-name>
  29. <param-value>true</param-value>
  30. </init-param>
  31. </filter>
  32. <filter-mapping>
  33. <filter-name>encodingFilter</filter-name>
  34. <url-pattern>/*</url-pattern>
  35. </filter-mapping>
  36.  
  37. <!-- 监听servletContext,启动contextConfigLocation中的spring配置信息 -->
  38. <listener>
  39. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  40. </listener>
  41.  
  42. <!-- 防止spring内存溢出监听器 可用可不用-->
  43. <listener>
  44. <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  45. </listener>
  46.  
  47. <!-- shiro
  48. <listener>
  49. <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
  50. </listener>
  51. -->
  52. <filter>
  53. <filter-name>shiroFilter</filter-name>
  54. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  55. <init-param>
  56. <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
  57. <param-name>targetFilterLifecycle</param-name>
  58. <param-value>true</param-value>
  59. </init-param>
  60. </filter>
  61. <filter-mapping>
  62. <filter-name>shiroFilter</filter-name>
  63. <url-pattern>/*</url-pattern>
  64. </filter-mapping>
  65.  
  66. <!-- 添加springmvc支持 -->
  67. <!-- 类似与servlet 需要在web.xml中都需要配置一样,spring的思想是让这些servlet【controller也是servlet】继承了一个基础的servlet,那就只需在web.xml中配置一个servlet即可。 -->
  68. <!-- 这个servlet和下面的servlet-mapping相配合使用,注明了所有的以.htmls结尾的请求都被截取到,去到servlet中去找相对应的方法 进行处理 -->
  69. <servlet>
  70. <description>spring mvc servlet</description>
  71. <servlet-name>rest</servlet-name>
  72. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  73. <init-param>
  74. <param-name>contextConfigLocation</param-name>
  75. <!-- 此处配置的是SpringMVC的配置文件 -->
  76. <param-value>classpath:spring-mvc.xml</param-value>
  77. </init-param>
  78. <load-on-startup>1</load-on-startup>
  79. </servlet>
  80. <!-- 配置了springmvc拦截的url为以.htmls结尾的请求 -->
  81. <servlet-mapping>
  82. <servlet-name>rest</servlet-name>
  83. <url-pattern>*.htmls</url-pattern>
  84. </servlet-mapping>
  85.  
  86. <!-- 配置session超时时间,单位分钟 -->
  87. <session-config>
  88. <session-timeout>30</session-timeout>
  89. </session-config>
  90. <!-- 欢迎界面 默认的项目访问界面 -->
  91. <welcome-file-list>
  92. <welcome-file>/index.jsp</welcome-file>
  93. </welcome-file-list>
  94. </web-app>

8.相关配置完成,然后,先把登录页面做出来

index.jsp【登录页面/主页面】

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>LOGIN VIEW</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  8. <body class="hold-transition skin-blue sidebar-mini">
  9. <h2 style="color:red " class="msg"></h2>
  10. <form method="post">
  11. userName:<input type="text" name="username"/><br/>
  12. password:<input type="password" name="password"/><br/>
  13. <button type="button">login</button>
  14. </form>
  15. </body>
  16.  
  17. <script type="text/javascript" src="js/jquery.js"></script>
  18. <!-- 使用ajax提交而不是用submit,避免了 重定向 302的状态码 -->
  19. <script type="text/javascript">
  20. $(document).ready(function(){
  21. $("button").click(function(){
  22.  
  23. var username = $("input[name='username']").val();
  24. var password = $("input[name='password']").val();
  25. //提交给后台
  26. $.ajax({url:"login/login.htmls",
  27. dataType:'json',
  28. type:"post",
  29. data:{username:username,password:password},
  30. traditional:true,
  31. success:function(data){
  32. if(data == "success"){
  33. location.href = "login/success.htmls";
  34. }else{
  35. $(".msg").text(data);
  36. }
  37. }
  38. });
  39. });
  40.  
  41. });
  42. </script>
  43. </html>

success.jsp【成功页面】

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="utf-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <title>Admin 主页</title>
  8. <!-- Tell the browser to be responsive to screen width -->
  9. <meta
  10. content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
  11. name="viewport">
  12.  
  13. <body>
  14. 成功
  15. <button type="button" class="123" onclick="logout()">退出</button>
  16. </body>
  17.  
  18. <script type="text/javascript">
  19. function logout(){
  20. location.href = "../login/logout.htmls";
  21. }
  22. </script>
  23. </html>

noAuth.jsp【没有权限页面】

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="utf-8">
  6. <title>没有权限页面</title>
  7. <!-- Tell the browser to be responsive to screen width -->
  8. <meta
  9. content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
  10. name="viewport">
  11.  
  12. <body class="hold-transition skin-blue sidebar-mini">
  13. 没有权限
  14. </body>
  15.  
  16. </html>

9.springMVC的Controller,控制页面跳转

LoginController.java

  1. package com.sxd.controller;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5.  
  6. import org.apache.shiro.SecurityUtils;
  7. import org.apache.shiro.authc.AuthenticationException;
  8. import org.apache.shiro.authc.IncorrectCredentialsException;
  9. import org.apache.shiro.authc.UnknownAccountException;
  10. import org.apache.shiro.authc.UsernamePasswordToken;
  11. import org.apache.shiro.authz.annotation.Logical;
  12. import org.apache.shiro.authz.annotation.RequiresGuest;
  13. import org.apache.shiro.authz.annotation.RequiresPermissions;
  14. import org.apache.shiro.authz.annotation.RequiresRoles;
  15. import org.apache.shiro.authz.annotation.RequiresUser;
  16. import org.apache.shiro.subject.Subject;
  17. import org.springframework.stereotype.Controller;
  18. import org.springframework.web.bind.annotation.RequestMapping;
  19. import org.springframework.web.bind.annotation.ResponseBody;
  20.  
  21. @Controller
  22. @RequestMapping("login")
  23. public class LoginController {
  24.  
  25. @RequestMapping("login")
  26. @ResponseBody
  27. public String login(String username,String password,HttpSession session){
  28.  
  29. Subject subject = SecurityUtils.getSubject();
  30. UsernamePasswordToken token = new UsernamePasswordToken(username, password);
  31. String errorMsg = null;
  32. try {
  33. subject.login(token);
  34. } catch (UnknownAccountException e) {
  35. errorMsg = "用户名错误";
  36. }catch (IncorrectCredentialsException e) {
  37. errorMsg = "用户密码错误";
  38. }catch (AuthenticationException e) {
  39. errorMsg = "其它异常:"+e.getMessage();
  40. }
  41.  
  42. if(errorMsg != null){
  43. System.out.println(errorMsg);
  44. return errorMsg;
  45. }
  46. return "success";
  47. }
  48.  
  49. @RequestMapping("success")
  50. public String success(){
  51. return "/welcome/success";
  52. }
  53.  
  54. @RequestMapping("/logout")
  55. public String logout(HttpServletRequest request) {
  56. request.getSession().invalidate();
  57. return "../../../index";
  58. }
  59.  
  60. /**
  61. * 当前登录用户 才能进入
  62. * @param request
  63. * @return
  64. */
  65. @RequestMapping("/user")
  66. @RequiresUser()
  67. public String admin(HttpServletRequest request) {
  68. return "/welcome/success";
  69. }
  70.  
  71. @RequestMapping("/admin1")
  72. @RequiresRoles(value="管理员1")
  73. public String student1(HttpServletRequest request) {
  74. return "/welcome/success";
  75. }
  76.  
  77. /**
  78. * 没有用户/角色/权限 规定
  79. * @param request
  80. * @return
  81. */
  82. @RequestMapping("/admin")
  83. public String teacher1(HttpServletRequest request) {
  84. return "/welcome/success";
  85. }
  86. /**
  87. * 角色为 这种角色的 才能进入
  88. * @param request
  89. * @return
  90. */
  91. @RequestMapping("/admin2")
  92. @RequiresRoles(value="管理员2")
  93. public String student2(HttpServletRequest request) {
  94. return "/welcome/success";
  95. }
  96. /**
  97. * 仅满足这种权限的 可以进入
  98. * @param request
  99. * @return
  100. */
  101. @RequestMapping("/admin3")
  102. @RequiresPermissions("疾病:增加")
  103. public String teacher2(HttpServletRequest request) {
  104. return "/welcome/success";
  105. }
  106. /**
  107. * 两种权限其中的一种满足 即满足
  108. * @param request
  109. * @return
  110. */
  111. @RequestMapping("/admin4")
  112. @RequiresPermissions(value={"产品:增加","产品:修改"},logical=Logical.OR)
  113. public String student3(HttpServletRequest request) {
  114. return "/welcome/success";
  115. }
  116.  
  117. /**
  118. * 两种权限都满足 才满足
  119. * @param request
  120. * @return
  121. */
  122. @RequestMapping("/admin5")
  123. @RequiresPermissions(value={"产品:增加","产品:修改"},logical=Logical.AND)
  124. public String teacher3(HttpServletRequest request) {
  125. return "/welcome/success";
  126. }
  127. @RequestMapping("/admin6")
  128. @RequiresPermissions(value="疾病:增加")
  129. public String student4(HttpServletRequest request) {
  130. return "/welcome/success";
  131. }
  132.  
  133. }

其中 使用注解将权限/角色/用户 具体到某一个具体的方法上

10.自定义的Realm和自定义的异常控制处理类

MyRealm.java

  1. package com.sxd.utils;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. import javax.annotation.Resource;
  7.  
  8. import org.apache.shiro.authc.AuthenticationException;
  9. import org.apache.shiro.authc.AuthenticationInfo;
  10. import org.apache.shiro.authc.AuthenticationToken;
  11. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  12. import org.apache.shiro.authz.AuthorizationInfo;
  13. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  14. import org.apache.shiro.realm.AuthorizingRealm;
  15. import org.apache.shiro.subject.PrincipalCollection;
  16. import org.hibernate.Criteria;
  17. import org.hibernate.Session;
  18. import org.hibernate.SessionFactory;
  19. import org.hibernate.criterion.DetachedCriteria;
  20. import org.hibernate.criterion.Restrictions;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Component;
  23.  
  24. import com.sxd.entity.Authority;
  25. import com.sxd.entity.Role;
  26. import com.sxd.entity.User;
  27. import com.sxd.service.UserService;
  28.  
  29. @Component(value="myRealm")
  30. public class MyRealm extends AuthorizingRealm {
  31.  
  32. @Resource
  33. private UserService userService;
  34. @Autowired
  35. private SessionFactory sessionFactory;
  36.  
  37. public Session getSession() {
  38. // 需要开启事物,才能得到CurrentSession
  39. return sessionFactory.openSession();
  40. }
  41.  
  42. /**
  43. * 用来为当前登陆成功的用户授予权限和角色(已经登陆成功了)
  44. */
  45. @Override
  46. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  47. String username = (String) principals.getPrimaryPrincipal(); //获取用户名
  48. SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
  49. //拼接criteria查询条件
  50. Criteria criteria = getSession().createCriteria(User.class);
  51. //根据用户名查询
  52. criteria.add(Restrictions.eq("userName", username));
  53. User user = userService.uniqueResult(criteria);
  54. if(user != null){
  55. //获取到用户的角色,根据角色,封装数据为Set<String>,将可以唯一确定本条数据的信息封装起来,供shiro对比使用
  56. Role role= user.getRole();
  57. Set<String> roleSet = new HashSet<String>();
  58. roleSet.add(role.getRoleName());
  59. authorizationInfo.setRoles(roleSet);
  60.  
  61. //同理,根据用户角色所拥有的权限,封装数据,将唯一确定本条权限信息的String封装为set,供shiro使用
  62. Set<Authority> authoritySet = role.getAuthorities();
  63. Set<String> auSet = new HashSet<String>();
  64. for (Authority authority : authoritySet) {
  65. auSet.add(authority.getAuthorityName());
  66. }
  67. authorizationInfo.setStringPermissions(auSet);
  68. return authorizationInfo;
  69. }else{
  70. return null;
  71. }
  72.  
  73. }
  74.  
  75. /**
  76. * 用来验证当前登录的用户,获取认证信息 (对比是否可以成功登录)
  77. */
  78. @Override
  79. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  80. String username = (String) token.getPrincipal();//获取用户名
  81. Criteria criteria = getSession().createCriteria(User.class);
  82. criteria.add(Restrictions.eq("userName", username));
  83. User user = userService.uniqueResult(criteria);
  84. if(user != null){
  85. AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(user.getUserName(), user.getPassword(), this.getName());
  86. return authcInfo;
  87. }else{
  88. return null;
  89. }
  90. }
  91.  
  92. }

MyExceptionResolver.java

  1. package com.sxd.utils;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5.  
  6. import org.apache.shiro.authz.UnauthorizedException;
  7. import org.springframework.web.servlet.HandlerExceptionResolver;
  8. import org.springframework.web.servlet.ModelAndView;
  9.  
  10. /**
  11. * 自定义 --异常处理类
  12. * @author Administrator
  13. *
  14. */
  15. public class MyExceptionResolver implements HandlerExceptionResolver {
  16.  
  17. @Override
  18. public ModelAndView resolveException(HttpServletRequest request,
  19. HttpServletResponse response, Object handler, Exception ex) {
  20. System.out.println("==============异常开始=============");
  21. //如果是shiro无权操作,因为shiro 在操作auno等一部分不进行转发至无权限url
  22. if(ex instanceof UnauthorizedException){
  23. ModelAndView mv = new ModelAndView("/error/noAuth");//指定跳转到没有权限的页面
  24. return mv;
  25. }
  26. ex.printStackTrace();
  27. System.out.println("==============异常结束=============");
  28. ModelAndView mv = new ModelAndView("error");
  29. mv.addObject("exception", ex.toString().replaceAll("\n", "<br/>"));
  30. return mv;
  31. }
  32.  
  33. }

11.项目搭建完成,启动tomcat

访问地址:http://localhost:8080/shiro-first/

用数据库中的某个用户登录:张三 123456

使用张三登录成功之后,张三的role是管理员1,管理员1对应的权限有疾病的增删改查,数据库中有

然后,此时张三登陆成功,

直接在地址栏修改地址为:http://localhost:8080/shiro-first/login/admin1.htmls

而更改地址为:http://localhost:8080/shiro-first/login/admin2.htmls

同理 测试其他的地址 即可!!!!!

【shiro】2.spring整合shiro,注解控制shiro用户/角色/权限And/OR,没有权限跳转到固定页面的更多相关文章

  1. shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决(XML配置)

    在使用Shiro框架进行项目整合时,使用注解在使用Shiro框架进行项目整合时,使用注解在使用Shiro框架进行项目整合时,使用注解@RequiresPermissions为方法提供是需要的权限,但是 ...

  2. Shiro与Spring整合

    Shiro引入Spring 添加jar包/maven配置 <!-- shiro支持 --> <dependency> <groupId>org.apache.shi ...

  3. 安全框架 - Shiro与springMVC整合的注解以及JSP标签

    Shiro想必大家都知道了,之前的文章我也有提过,是目前使用率要比spring security都要多的一个权限框架,本身spring自己都在用shiro,之前的文章有兴趣可以去扒一下 最近正好用到s ...

  4. Shiro 与spring 整合的及简单使用(转)

    文章完全转载自: http://www.cnblogs.com/learnhow/p/5694876.html  ,大家可以点击访问原文链接,个人仅作学习收藏 ! 本篇内容大多总结自张开涛的<跟 ...

  5. spring 整合hibernate注解时候,出现“Unknown entity: com.ssh.entry.Admin; nested exception is org.hibernate.MappingException: Unknown entity: com.ssh.entry.Admin”异常的问题

    今天学习使用ssh框架的时候,出现一个异常,弄了好久才找到,在这记录一下,我的sb错误1.spring整合hibernate,取代*.hbm.xml配置文件   在applicationContext ...

  6. Hibernate Validation与Spring整合各注解的用法Demo

    转自:https://www.aliyun.com/jiaocheng/1315650.html <dependency> <groupId>org.hibernate< ...

  7. Shiro第四篇【Shiro与Spring整合、快速入门、Shiro过滤器、登陆认证】

    Spring与Shiro整合 导入jar包 shiro-web的jar. shiro-spring的jar shiro-code的jar 快速入门 shiro也通过filter进行拦截.filter拦 ...

  8. spring整合ehcache注解实现查询缓存,并实现实时缓存更新或删除

    转载: http://www.importnew.com/23358.html 写在前面:上一篇博客写了spring cache和ehcache的基本介绍,个人建议先把这些最基本的知识了解了才能对今天 ...

  9. spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除

    写在前面:上一篇博客写了spring cache和ehcache的基本介绍,个人建议先把这些最基本的知识了解了才能对今天主题有所感触.不多说了,开干! 注:引入jar <!-- 引入ehcach ...

随机推荐

  1. Mac iphone 使用 如何修改apple 用户名 XXX的mac Mac 与iphone如何连接 传递文件 为iphone增加铃声 iphone铃声的制作---城

    1.更改mac apple id Apple ID 即用户名称,您可以将其用于与 Apple 有关的所有操作.为某个 Apple 服务(如 iCloud 或 App Store)创建帐户时即创建了 A ...

  2. mybatis-plus的学习

    1.mybatisplus 提供了比较齐全的crud即增删改查,不需要在mapper.xml里写sql可以直接调用 原文链接:http://blog.csdn.net/u014519194/artic ...

  3. centos7 安装 NVIDIA Docker

    安装环境: 1.centos7.3 2.NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] 安装nvidia-docker a.安装docker 可参考ce ...

  4. js-callee,call,apply概念

    JS - caller,callee,call,apply 概念[转载] 在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正 ...

  5. gradle eclipse 配置

    http://blog.csdn.net/caolaosanahnu/article/details/17022321 从gradle官网下载 解压,配置环境变量,gradle -v 验证 gradl ...

  6. poj 2452(RMQ+二分查找)

    题目链接: http://poj.org/problem?id=2452 题意:在区间[1,n]上找到满足 a[i]<a[k]<a[j] (i<=k<=j) 的最大子区间 (j ...

  7. 【JBPM4】获取任务

    示例代码: <?xml version="1.0" encoding="UTF-8"?> <process name="test&q ...

  8. string char * const char *之间的互相转换

    string  ->   const char * 用str的c_str()方法或者data()方法均可,这个两个方法返回值为cong char * string str = "hel ...

  9. section

    @RenderSection("Header")   @section Header { <div class="view"> @foreach ( ...

  10. 8种json数据查询方式

    你有没有对“在复杂的JSON数据结构中查找匹配内容”而烦恼.这里有8种不同的方式可以做到: JsonSQL JsonSQL实现了使用SQL select语句在json数据结构中查询的功能. 例子: ? ...