【shiro】2.spring整合shiro,注解控制shiro用戶/角色/權限And/OR,沒有權限跳轉到固定頁面


這幾天粗淺的把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 
 8 /*!40101 SET NAMES utf8 */;
 9 
10 /*!40101 SET SQL_MODE=''*/;
11 
12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
16 CREATE DATABASE /*!32312 IF NOT EXISTS*/`shiros` /*!40100 DEFAULT CHARACTER SET utf8 */;
17 
18 USE `shiros`;
19 
20 /*Table structure for table `authority` */
21 
22 DROP TABLE IF EXISTS `authority`;
23 
24 CREATE TABLE `authority` (
25   `authorityId` varchar(36) NOT NULL,
26   `authorityName` varchar(20) DEFAULT NULL,
27   `authorityContent` varchar(500) DEFAULT NULL,
28   PRIMARY KEY (`authorityId`)
29 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
30 
31 /*Data for the table `authority` */
32 
33 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);
34 
35 /*Table structure for table `role` */
36 
37 DROP TABLE IF EXISTS `role`;
38 
39 CREATE TABLE `role` (
40   `roleId` varchar(36) NOT NULL,
41   `roleName` varchar(36) DEFAULT NULL,
42   `roleGrade` int(11) DEFAULT NULL,
43   PRIMARY KEY (`roleId`)
44 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
45 
46 /*Data for the table `role` */
47 
48 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);
49 
50 /*Table structure for table `roleauthority` */
51 
52 DROP TABLE IF EXISTS `roleauthority`;
53 
54 CREATE TABLE `roleauthority` (
55   `roleId` varchar(36) NOT NULL,
56   `authorityId` varchar(36) NOT NULL,
57   PRIMARY KEY (`roleId`,`authorityId`),
58   KEY `FK_Relationship_3` (`authorityId`),
59   CONSTRAINT `FK_Relationship_2` FOREIGN KEY (`roleId`) REFERENCES `role` (`roleId`),
60   CONSTRAINT `FK_Relationship_3` FOREIGN KEY (`authorityId`) REFERENCES `authority` (`authorityId`)
61 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
62 
63 /*Data for the table `roleauthority` */
64 
65 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');
66 
67 /*Table structure for table `user` */
68 
69 DROP TABLE IF EXISTS `user`;
70 
71 CREATE TABLE `user` (
72   `userId` varchar(36) NOT NULL,
73   `roleId` varchar(36) NOT NULL,
74   `userName` varchar(20) DEFAULT NULL,
75   `password` varchar(20) DEFAULT NULL,
76   PRIMARY KEY (`userId`),
77   KEY `FK_Relationship_1` (`roleId`),
78   CONSTRAINT `FK_Relationship_1` FOREIGN KEY (`roleId`) REFERENCES `role` (`roleId`)
79 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
80 
81 /*Data for the table `user` */
82 
83 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');
84 
85 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
86 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
87 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
88 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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         
 79         <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-common -->
 80         <dependency>
 81             <groupId>com.github.binarywang</groupId>
 82             <artifactId>weixin-java-common</artifactId>
 83             <version>2.2.0</version>
 84         </dependency>
 85         <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-mp -->
 86         <dependency>
 87             <groupId>com.github.binarywang</groupId>
 88             <artifactId>weixin-java-mp</artifactId>
 89             <version>2.2.0</version>
 90         </dependency>
 91         
 92         
 93         <!-- junit -->
 94         <dependency>
 95             <groupId>junit</groupId>
 96             <artifactId>junit</artifactId>
 97             <version>4.12</version>
 98             <scope>test</scope>
 99         </dependency>
100 
101         <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
102         <dependency>
103             <groupId>com.github.pagehelper</groupId>
104             <artifactId>pagehelper</artifactId>
105             <version>4.1.4</version>
106         </dependency>
107         
108         <!-- spring -->
109         <dependency>
110             <groupId>org.springframework</groupId>
111             <artifactId>spring-core</artifactId>
112             <version>${spring.version}</version>
113         </dependency>
114 
115         <dependency>
116             <groupId>org.springframework</groupId>
117             <artifactId>spring-beans</artifactId>
118             <version>${spring.version}</version>
119         </dependency>
120 
121         <dependency>
122             <groupId>org.springframework</groupId>
123             <artifactId>spring-context</artifactId>
124             <version>${spring.version}</version>
125         </dependency>
126 
127         <dependency>
128             <groupId>org.springframework</groupId>
129             <artifactId>spring-tx</artifactId>
130             <version>${spring.version}</version>
131         </dependency>
132 
133         <dependency>
134             <groupId>org.springframework</groupId>
135             <artifactId>spring-web</artifactId>
136             <version>${spring.version}</version>
137         </dependency>
138 
139         <dependency>
140             <groupId>org.springframework</groupId>
141             <artifactId>spring-test</artifactId>
142             <version>${spring.version}</version>
143             <scope>test</scope>
144         </dependency>
145 
146         <!-- 使用SpringMVC需配置 -->
147         <dependency>
148             <groupId>org.springframework</groupId>
149             <artifactId>spring-webmvc</artifactId>
150             <version>${spring.version}</version>
151         </dependency>
152         <!-- spring cglib 代理 -->
153         <dependency>
154             <groupId>cglib</groupId>
155             <artifactId>cglib</artifactId>
156             <version>2.2.2</version>
157         </dependency>
158         <!-- 關系型數據庫整合時需配置 如hibernate jpa等 -->
159         <dependency>
160             <groupId>org.springframework</groupId>
161             <artifactId>spring-orm</artifactId>
162             <version>${spring.version}</version>
163         </dependency>
164 
165         <!-- hibernate -->
166         <dependency>
167             <groupId>org.hibernate</groupId>
168             <artifactId>hibernate-core</artifactId>
169             <version>${hibernate.version}</version>
170             
171         </dependency>
172 
173         <dependency>
174             <groupId>org.hibernate</groupId>
175             <artifactId>hibernate-ehcache</artifactId>
176             <version>${hibernate.version}</version>
177         </dependency>
178 
179         <!-- 二級緩存ehcache -->
180         <dependency>
181             <groupId>net.sf.ehcache</groupId>
182             <artifactId>ehcache</artifactId>
183             <version>2.9.0</version>
184         </dependency>
185 
186         <!-- log4j -->
187         <dependency>
188             <groupId>log4j</groupId>
189             <artifactId>log4j</artifactId>
190             <version>1.2.17</version>
191         </dependency>
192 
193         <!-- mysql連接 -->
194         <dependency>
195             <groupId>mysql</groupId>
196             <artifactId>mysql-connector-java</artifactId>
197             <version>5.1.34</version>
198         </dependency>
199 
200         <!-- c3p0數據源 -->
201         <dependency>
202             <groupId>com.mchange</groupId>
203             <artifactId>c3p0</artifactId>
204             <version>0.9.5-pre10</version>
205         </dependency>
206 
207         <!-- json -->
208 
209         <!-- 1號 -->
210         <dependency>
211             <groupId>com.fasterxml.jackson.core</groupId>
212             <artifactId>jackson-core</artifactId>
213             <version>2.8.1</version>
214         </dependency>
215         <!-- 2號 -->
216         <dependency>
217             <groupId>com.fasterxml.jackson.core</groupId>
218             <artifactId>jackson-annotations</artifactId>
219             <version>2.8.1</version>
220         </dependency>
221 
222         <!-- 3號 -->
223         <dependency>
224             <groupId>com.fasterxml.jackson.core</groupId>
225             <artifactId>jackson-databind</artifactId>
226             <version>2.8.1</version>
227             <exclusions>
228                 <exclusion>
229                     <artifactId>jackson-core</artifactId>
230                     <groupId>com.fasterxml.jackson.core</groupId>
231                 </exclusion>
232                 <exclusion>
233                     <artifactId>jackson-annotations</artifactId>
234                     <groupId>com.fasterxml.jackson.core</groupId>
235                 </exclusion>
236             </exclusions>
237         </dependency>
238 
239         <!-- 4號 -->
240         <dependency>
241             <groupId>com.google.code.gson</groupId>
242             <artifactId>gson</artifactId>
243             <version>2.7</version>
244         </dependency>
245         <!-- 5號 -->
246         <dependency>
247             <groupId>net.sf.json-lib</groupId>
248             <artifactId>json-lib</artifactId>
249             <version>2.4</version>
250             <classifier>jdk15</classifier>
251         </dependency>
252         <!-- 5號json-lib還需要以下依賴包 -->
253         <dependency>
254             <groupId>commons-lang</groupId>
255             <artifactId>commons-lang</artifactId>
256             <version>2.5</version>
257         </dependency>
258         <dependency>
259             <groupId>commons-beanutils</groupId>
260             <artifactId>commons-beanutils</artifactId>
261             <version>1.9.2</version>
262         </dependency>
263         <dependency>
264             <groupId>commons-collections</groupId>
265             <artifactId>commons-collections</artifactId>
266             <version>3.2.1</version>
267         </dependency>
268         <dependency>
269             <groupId>commons-logging</groupId>
270             <artifactId>commons-logging</artifactId>
271             <version>1.2</version>
272         </dependency>
273         
274         <!-- aop -->
275         <dependency>
276             <groupId>org.aspectj</groupId>
277             <artifactId>aspectjweaver</artifactId>
278             <version>1.8.4</version>
279         </dependency>
280 
281         <!-- servlet -->
282         <dependency>
283             <groupId>javax.servlet</groupId>
284             <artifactId>servlet-api</artifactId>
285             <version>3.0-alpha-1</version>
286             <scope>provided</scope>
287         </dependency>
288 
289         <dependency>
290             <groupId>javax.servlet</groupId>
291             <artifactId>jstl</artifactId>
292             <version>1.2</version>
293         </dependency>
294         <!-- guava 集合的交並操作 -->        
295         <dependency>
296             <groupId>com.google.guava</groupId>
297             <artifactId>guava</artifactId>
298             <version>19.0</version>
299         </dependency>
300         <dependency>
301             <groupId>com.google.guava</groupId>
302             <artifactId>guava-collections</artifactId>
303             <version>r03</version>
304         </dependency>
305         
306         <!-- 文件上傳 -->
307         <dependency>
308             <groupId>commons-fileupload</groupId>
309             <artifactId>commons-fileupload</artifactId>
310             <version>1.3.1</version>
311         </dependency>
312         
313   </dependencies>
314   
315 </project>
View Code

尤其注意,這里着重看一下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 
 15 public interface GenericDao<T, PK extends Serializable> {
 16     /**
 17      * 查詢全部,可以排序
 18      * @param orderBy
 19      * @param isAsc
 20      * @return List<T>
 21      */
 22     public List<T> list(Criteria criteria);
 23 
 24     /**
 25      * 查詢全部,可以排序
 26      * @param orderBy
 27      * @param isAsc
 28      * @return List<T>
 29      */
 30     public List<T> list(String orderBy, boolean isAsc);
 31     
 32     /**
 33      * 離線查詢
 34      * @param criteria
 35      * @return List<T>
 36      */
 37     public List<T> list(DetachedCriteria criteria);
 38     
 39     /**
 40      * 根據Criteria查詢條件,獲取總數
 41      * @param criteria
 42      * @return int
 43      * @throws SecurityException 
 44      * @throws NoSuchFieldException 
 45      * @throws IllegalAccessException 
 46      * @throws IllegalArgumentException 
 47      */
 48     public int countAll(Criteria criteria);
 49     
 50     /**
 51      * 獲取總數(默認為entityClass) 即查詢總條數
 52      * @return int
 53      */
 54     public int countAll();
 55     
 56     /**
 57      * 根據I判斷是否存在
 58      * @param id
 59      * @return boolean
 60      */
 61     public boolean exists(PK id);
 62     
 63     /**
 64      * 保存實體 
 65      * @param t 實體參數
 66      */
 67     public void save(T t);
 68 
 69     /**
 70      * 保存或者更新實體
 71      * @param t 實體
 72      */
 73     public void saveOrUpdate(T t);
 74 
 75     /**
 76      * 加載實體的通過load方法
 77      * @param id 實體的id
 78      * @return 查詢出來的實體
 79      */
 80     public T load(PK id);
 81     
 82     /**
 83      * 合並實體 
 84      * @param entity
 85      */
 86     public void merge(T entity);
 87     
 88     /**
 89      * 查找全部
 90      */
 91     public List<T> findAll();
 92 
 93     /**
 94      * 通過get方法加載實體的
 95      * @param id 實體的id
 96      * @return 查詢出來的實體
 97      */
 98     public T get(PK id);
 99 
100     /**
101      * contains
102      * @param t 實體
103      * @return 是否包含
104      */
105     public boolean contains(T t);
106 
107     /**
108      * delete
109      * @param t
110      * 刪除實體
111      */
112     public void delete(T t);
113 
114     /**
115      * 根據ID刪除數據
116      * @param Id 實體id
117      * @return 是否刪除成功
118      */
119     public boolean deleteById(PK Id);
120 
121     /**
122      * 刪除所有
123      * @param entities 實體的Collection集合
124      */
125     public void deleteAll(Collection<T> entities);
126 
127     /**
128      * 執行Hql語句 要求 hql中參數順序與可變參數 中參數順序相一致
129      * @param hqlString hql
130      * @param values 不定參數數組
131      */
132     public void queryHql(String hqlString, Object... values);
133 
134     /**
135      * 執行Sql語句(不建議用,影響擴展)
136      * @param sqlString sql
137      * @param values 不定參數數組
138      */
139     public void querySql(String sqlString, Object... values);
140 
141     /**
142      * 根據HQL語句查找唯一實體
143      * 
144      * @param hqlString HQL語句
145      * @param values 不定參數的Object數組
146      * @return 查詢實體
147      */
148     public T getByHQL(String hqlString, Object... values);
149     
150     /**
151      * 根據SQL語句查找唯一實體(不建議用,影響擴展)
152      * @param sqlString SQL語句
153      * @param values 不定參數的Object數組
154      * @return 查詢實體
155      */
156 
157     /**
158      * 根據HQL語句,得到對應的list
159      * @param hqlString HQL語句
160      * @param values 不定參數的Object數組
161      * @return 查詢多個實體的List集合
162      */
163     public List<T> getListByHQL(String hqlString, Object... values);
164 
165     /**
166      * 根據SQL語句,得到對應的list(不建議用,影響擴展)
167      * @param sqlString HQL語句
168      * @param values 不定參數的Object數組
169      * @return 查詢多個實體的List集合
170      */
171     public List<T> getListBySQL(String sqlString,Class c, Object... values);
172 
173     /**
174      * refresh 刷新實體,強制與數據庫兩步 refresh方法應該是數據庫的數據更新到本地的person實體中,而不是本地person更新數據到數據庫中  也就是執行refresh方法是更新了java代碼中變量的數據值
175      * @param t 實體
176      */
177     public void refresh(T t);
178 
179     /**
180      * update
181      * @param t
182      * 更新的是數據庫中的數據
183      */
184     public void update(T t);
185 
186     /**
187      * 根據HQL得到記錄數
188      * @param hql HQL語句
189      * @param values 不定參數的Object數組
190      * @return 記錄總數
191      */
192     public Long countByHql(String hql, Object... values);
193 
194     /**
195      * HQL分頁查詢
196      * 
197      * @param hql HQL語句
198      * @param countHql 查詢記錄條數的HQL語句
199      * @param pageNo 下一頁
200      * @param pageSize 一頁總條數
201      * @param values  不定Object數組參數
202      * @return PageResults的封裝類,里面包含了頁碼的信息以及查詢的數據List集合
203      */
204     public  PageInfo<T> findPageByHql(String hql, String countHql, int pageNo, int pageSize, Object... values);
205     
206     /**
207      * 按屬性查找對象列表,匹配方式為相等
208      * @param propertyName
209      * @param value
210      * @return List<T>
211      */
212     public List<T> list(String propertyName, Object value);
213     
214     /**
215      * 根據criterion查詢條件獲取數據列表
216      * @param criterion
217      * @return List<T>
218      */
219     public List<T> list(Criterion criterion);
220     
221     /**
222      * 按Criteria查詢對象列表
223      * @param criterions
224      * @return List<T>
225      */
226     public List<T> list(Criterion... criterions);
227     
228     /**
229      * 按屬性查找唯一對象,匹配方式為相等
230      * @param propertyName
231      * @param value
232      * @return T
233      */
234     public T uniqueResult(String propertyName, Object value);
235     
236     /**
237      * 按Criteria查詢唯一對象
238      * @param criterions
239      * @return T
240      */
241     public T uniqueResult(Criterion... criterions);
242     
243     /**
244      * 按Criteria查詢唯一對象
245      * @param criteria
246      * @return T
247      */
248     public T uniqueResult(Criteria criteria);
249     
250     /**
251      * 按criteria查詢某個Integer類型的字段
252      * @param criteria
253      * @return
254      */
255     public Integer uniqueResultInt(Criteria criteria);
256     
257     /**
258      * 為Criteria添加distinct transformer
259      * @param criteria
260      * @return Criteria
261      */
262     public Criteria distinct(Criteria criteria);
263     
264     /**
265      * 刷新session
266      */
267     public void flush();
268     
269     /**
270      * 清空session
271      */
272     public void clear();
273     
274     /**
275      * 創建Criteria實例
276      */
277     public Criteria createCriteria();
278     
279     /**
280      * 根據Criterion條件創建Criteria
281      * @param criterions
282      * @return Criteria
283      */
284     public Criteria createCriteria(Criterion... criterions);
285     
286     /**
287      * 分頁查詢Criteria
288      * @param criteria 
289      * @param pageNo 下頁頁碼
290      * @param pageSize 頁面數據量
291      * @return List<T>
292      */
293     public List<T> findPage(Criteria criteria, int pageNo, int pageSize);
294     
295     /**
296      * 分頁查詢Criteria
297      * @param criteria
298      * @param pageNo
299      * @param pageSize
300      * @return PageInfo<T>
301      * @throws SecurityException 
302      * @throws NoSuchFieldException 
303      * @throws IllegalAccessException 
304      * @throws IllegalArgumentException 
305      */
306     public PageInfo<T> findQuery(Criteria criteria, int pageNo, int pageSize);
307     
308     /**
309      * 
310      * @param hql
311      * @param pageNo
312      * @param pageSize
313      * @param map
314      * @return List<T>
315      */
316     public List<T> findQuery(String hql, int pageNo, int pageSize, Map<?, ?> map);
317 
318 }
View Code

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

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     
257     /**
258      * 為Criteria添加distinct transformer
259      * @param criteria
260      * @return Criteria
261      */
262     public Criteria distinct(Criteria criteria);
263     
264     /**
265      * 刷新session
266      */
267     public void flush();
268     
269     /**
270      * 清空session
271      */
272     public void clear();
273     
274     /**
275      * 創建Criteria實例
276      */
277     public Criteria createCriteria();
278     
279     /**
280      * 根據Criterion條件創建Criteria
281      * @param criterions
282      * @return Criteria
283      */
284     public Criteria createCriteria(Criterion... criterions);
285     
286     /**
287      * 分頁查詢Criteria
288      * @param criteria 
289      * @param pageNo 下頁頁碼
290      * @param pageSize 頁面數據量
291      * @return List<T>
292      */
293     public List<T> findPage(Criteria criteria, int pageNo, int pageSize);
294     
295     /**
296      * 分頁查詢Criteria
297      * @param criteria
298      * @param pageNo
299      * @param pageSize
300      * @return PageInfo<T>
301      * @throws SecurityException 
302      * @throws NoSuchFieldException 
303      * @throws IllegalAccessException 
304      * @throws IllegalArgumentException 
305      */
306     public PageInfo<T> findQuery(Criteria criteria, int pageNo, int pageSize);
307     
308     /**
309      * 
310      * @param hql
311      * @param pageNo
312      * @param pageSize
313      * @param map
314      * @return List<T>
315      */
316     public List<T> findQuery(String hql, int pageNo, int pageSize, Map<?, ?> map);
317 
318 }
View Code

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

使用工具類生成實體的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 }
View Code

 

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
View Code

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 
28 
29 </ehcache>
View Code

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
View Code

 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         
 32     <!-- 自動掃描@Controller注入為bean -->
 33     <context:property-placeholder location="classpath:config.properties"/>
 34     <!-- 自動掃描@Controller注入為bean -->
 35     <context:component-scan base-package="com.agen" />
 36     
 37     <!-- 標明注解事務 -->
 38     <tx:annotation-driven transaction-manager="transactionManager" /> 
 39     
 40         
 41     <!-- 配置數據源 c3p0 -->
 42     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
 43         destroy-method="close">
 44         <property name="driverClass" value="${jdbc.driver}" />
 45         <property name="jdbcUrl" value="${jdbc.url}" />
 46         <property name="user" value="${jdbc.username}" />
 47         <property name="password" value="${jdbc.password}" />
 48 
 49         <!-- 請求超時時間 -->
 50         <property name="checkoutTimeout" value="30000" />
 51         <!-- 每60秒檢查所有連接池中的空閑連接。默認值: 0,不檢查 -->
 52         <property name="idleConnectionTestPeriod" value="30" />
 53         <!-- 連接數據庫連接池最大空閑時間 -->
 54         <property name="maxIdleTime" value="30" />
 55         <!-- 連接池初始化連接數 -->
 56         <property name="initialPoolSize" value="5" />
 57         <property name="minPoolSize" value="5" />
 58         <property name="maxPoolSize" value="20" />
 59         <!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。默認值: 3 -->
 60         <property name="acquireIncrement" value="5" />
 61     </bean>
 62 
 63     <!-- 配置hibernate的SessionFactory -->
 64     <bean id="sessionFactory"
 65         class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 66         <!-- 注入數據源 相關信息看源碼 -->
 67         <property name="dataSource" ref="dataSource" />
 68         <!-- hibernate配置信息 -->
 69         <property name="hibernateProperties">
 70             <props>
 71                 <prop key="hibernate.dialect">${hibernate.dialect}</prop>
 72                 <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
 73                 <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
 74                 <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
 75 
 76                 <!-- 開啟二級緩存 ehcache -->
 77                 <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
 78                 <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
 79                 <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
 80                 <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.cache.provider_configuration_file_resource_path}
 81                 </prop>
 82             </props>
 83         </property>
 84         <!-- 掃描hibernate注解配置的entity -->
 85         <property name="packagesToScan" value="com.agen.entity" />
 86     </bean>
 87 
 88     <!-- 配置事務管理器 -->
 89     <bean id="transactionManager"
 90         class="org.springframework.orm.hibernate4.HibernateTransactionManager">
 91         <property name="sessionFactory" ref="sessionFactory" />
 92     </bean>
 93     
 94      <!-- 自定義Realm 
 95     <bean id="myRealm" class="com.sxd.utils.MyRealm">
 96            <property name="sessionFactory" ref="sessionFactory" />
 97     </bean>-->
 98 
 99     <!-- 安全管理器 -->
100     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
101       <property name="realm" ref="myRealm"/>  
102     </bean>  
103 
104     <!-- Shiro過濾器 -->
105     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
106         <!-- Shiro的核心安全接口,這個屬性是必須的 -->  
107         <property name="securityManager" ref="securityManager"/>
108         <!-- 身份認證失敗,則跳轉到登錄頁面的配置 -->  
109         <property name="loginUrl" value="/index.jsp"/>
110         <!-- 權限認證失敗,則跳轉到指定頁面 -->  
111         <property name="unauthorizedUrl" value="/error.jsp"/>  
112         <!-- Shiro連接約束配置,即過濾鏈的定義 -->  
113         <property name="filterChainDefinitions" ref="filterChainDefinitions" />
114     </bean>  
115     <bean name="filterChainDefinitions" class="java.lang.String">
116         <constructor-arg>
117             <value>
118                 /=anon
119                 /index.jsp=anon
120                 /login/login1.htmls=anon
121                 /login/register.htmls=anon
122                 /js/** = anon
123                 /bootstrap/** = anon
124                 /css/** = anon
125                 /images/** = anon
126                 /layer/** = anon
127                 /lib/** = anon
128                 /skin/** = anon
129                 /temp/** = anon
130                 /upload/** = anon
131                 /**=authc 
132             </value>
133         </constructor-arg>
134     </bean>
135 
136     <!-- 保證實現了Shiro內部lifecycle函數的bean執行 -->  
137     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>  
138 
139     <!-- 開啟Shiro注解 -->
140     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
141         <property name="proxyTargetClass" value="true"/> 
142     </bean>  
143     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
144           <property name="securityManager" ref="securityManager"/>  
145     </bean>  
146     
147     <!-- 自定義異常處理-->
148     <bean id="exceptionResolver" class="com.agen.util.MyExceptionResolver"></bean> 
149     
150     
151 </beans>
View Code

 

着重注意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>

<!-- 自定義Realm 
    <bean id="myRealm" class="com.sxd.utils.MyRealm">
           <property name="sessionFactory" ref="sessionFactory" />
    </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        <!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前后綴 -->
17         <bean
18             class="org.springframework.web.servlet.view.InternalResourceViewResolver">
19             <property name="viewClass"
20                 value="org.springframework.web.servlet.view.JstlView" />
21             <property name="prefix" value="/WEB-INF/views" />
22             <property name="suffix" value=".jsp" />
23         </bean>
24     
25 
26     <!-- 實現文件上傳,這樣一旦某個Request是一個MultipartRequest,它就會首先被MultipartResolver處理,然后再轉發相應的Controller -->
27     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
28          <!-- 設置上傳文件的最大尺寸為1GB -->
29          <!-- <property name="maxUploadSize">
30           <value>1073741824</value>
31          </property> -->
32     </bean>
33     
34 </beans>
View Code

 

 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   
38 <!-- 監聽servletContext,啟動contextConfigLocation中的spring配置信息 -->
39     <listener>
40         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
41     </listener>
42 
43 
44     <!-- 防止spring內存溢出監聽器   可用可不用-->
45     <listener>
46         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
47     </listener>
48     
49     <!-- shiro 
50     <listener>
51         <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
52     </listener>
53      -->
54      <filter>  
55         <filter-name>shiroFilter</filter-name>  
56         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
57         <init-param>  
58             <!-- 該值缺省為false,表示生命周期由SpringApplicationContext管理,設置為true則表示由ServletContainer管理 -->  
59             <param-name>targetFilterLifecycle</param-name>  
60             <param-value>true</param-value>  
61         </init-param>  
62     </filter>  
63     <filter-mapping>  
64         <filter-name>shiroFilter</filter-name>  
65         <url-pattern>/*</url-pattern>  
66     </filter-mapping>  
67     
68 
69 <!-- 添加springmvc支持 -->
70 <!-- 類似與servlet 需要在web.xml中都需要配置一樣,spring的思想是讓這些servlet【controller也是servlet】繼承了一個基礎的servlet,那就只需在web.xml中配置一個servlet即可。 -->
71 <!-- 這個servlet和下面的servlet-mapping相配合使用,注明了所有的以.htmls結尾的請求都被截取到,去到servlet中去找相對應的方法 進行處理 -->
72     <servlet>
73         <description>spring mvc servlet</description>
74         <servlet-name>rest</servlet-name>
75         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
76         <init-param>
77             <param-name>contextConfigLocation</param-name>
78             <!-- 此處配置的是SpringMVC的配置文件 -->
79             <param-value>classpath:spring-mvc.xml</param-value>
80         </init-param>
81         <load-on-startup>1</load-on-startup>
82     </servlet>
83     <!-- 配置了springmvc攔截的url為以.htmls結尾的請求 -->
84     <servlet-mapping>
85         <servlet-name>rest</servlet-name>
86         <url-pattern>*.htmls</url-pattern>
87     </servlet-mapping>
88 
89     <!-- 配置session超時時間,單位分鍾 -->
90     <session-config>
91         <session-timeout>30</session-timeout>
92     </session-config>
93     <!-- 歡迎界面 默認的項目訪問界面 -->
94     <welcome-file-list>
95         <welcome-file>/index.jsp</welcome-file>
96     </welcome-file-list>
97 </web-app>
View Code

 

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>
View Code

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>
View Code

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 
17 </html>
View Code

 

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     
 26     @RequestMapping("login")
 27     @ResponseBody
 28     public String login(String username,String password,HttpSession session){
 29         
 30         Subject subject = SecurityUtils.getSubject();
 31         UsernamePasswordToken token = new UsernamePasswordToken(username, password);
 32         String errorMsg = null;
 33         try {
 34             subject.login(token);
 35         } catch (UnknownAccountException e) {
 36             errorMsg = "用戶名錯誤";
 37         }catch (IncorrectCredentialsException e) {
 38             errorMsg = "用戶密碼錯誤";
 39         }catch (AuthenticationException e) {
 40             errorMsg = "其它異常:"+e.getMessage();
 41         }
 42         
 43         if(errorMsg != null){
 44             System.out.println(errorMsg);
 45             return errorMsg;
 46         }
 47         return "success";
 48     }
 49     
 50     @RequestMapping("success")
 51     public String success(){
 52         return "/welcome/success";
 53     }
 54     
 55     
 56     @RequestMapping("/logout")
 57     public String logout(HttpServletRequest request) {
 58         request.getSession().invalidate();
 59         return "../../../index";
 60     }   
 61 
 62     /**
 63      * 當前登錄用戶   才能進入
 64      * @param request
 65      * @return
 66      */
 67     @RequestMapping("/user")
 68     @RequiresUser()
 69     public String admin(HttpServletRequest request) {
 70         return "/welcome/success";
 71     }
 72 
 73     @RequestMapping("/admin1")
 74     @RequiresRoles(value="管理員1")
 75     public String student1(HttpServletRequest request) {
 76         return "/welcome/success";
 77     }   
 78 
 79     /**
 80      * 沒有用戶/角色/權限 規定
 81      * @param request
 82      * @return
 83      */
 84     @RequestMapping("/admin")
 85     public String teacher1(HttpServletRequest request) {
 86         return "/welcome/success";
 87     }  
 88     /**
 89      * 角色為 這種角色的  才能進入
 90      * @param request
 91      * @return
 92      */
 93     @RequestMapping("/admin2")
 94     @RequiresRoles(value="管理員2")
 95     public String student2(HttpServletRequest request) {
 96         return "/welcome/success";
 97     }   
 98     /**
 99      * 僅滿足這種權限的 可以進入
100      * @param request
101      * @return
102      */
103     @RequestMapping("/admin3")
104     @RequiresPermissions("疾病:增加")
105     public String teacher2(HttpServletRequest request) {
106         return "/welcome/success";
107     }  
108     /**
109      * 兩種權限其中的一種滿足 即滿足
110      * @param request
111      * @return
112      */
113     @RequestMapping("/admin4")
114     @RequiresPermissions(value={"產品:增加","產品:修改"},logical=Logical.OR)
115     public String student3(HttpServletRequest request) {
116         return "/welcome/success";
117     }   
118     
119     /**
120      * 兩種權限都滿足 才滿足
121      * @param request
122      * @return
123      */
124     @RequestMapping("/admin5")
125     @RequiresPermissions(value={"產品:增加","產品:修改"},logical=Logical.AND)
126     public String teacher3(HttpServletRequest request) {
127         return "/welcome/success";
128     }  
129     @RequestMapping("/admin6")
130     @RequiresPermissions(value="疾病:增加")
131     public String student4(HttpServletRequest request) {
132         return "/welcome/success";
133     }   
134     
135 }
View Code

其中 使用注解將權限/角色/用戶 具體到某一個具體的方法上

 

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     
33     @Resource
34     private UserService userService;
35     @Autowired
36     private SessionFactory sessionFactory;
37     
38     public Session getSession() {
39         // 需要開啟事物,才能得到CurrentSession
40         return sessionFactory.openSession();
41     }
42     
43     /**
44      * 用來為當前登陸成功的用戶授予權限和角色(已經登陸成功了)
45      */
46     @Override
47     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
48             String username = (String) principals.getPrimaryPrincipal(); //獲取用戶名
49             SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
50             //拼接criteria查詢條件
51             Criteria criteria = getSession().createCriteria(User.class);
52             //根據用戶名查詢
53             criteria.add(Restrictions.eq("userName", username));
54             User user = userService.uniqueResult(criteria);
55             if(user != null){
56                 //獲取到用戶的角色,根據角色,封裝數據為Set<String>,將可以唯一確定本條數據的信息封裝起來,供shiro對比使用
57                 Role role= user.getRole(); 
58                 Set<String> roleSet = new HashSet<String>();
59                 roleSet.add(role.getRoleName());
60                 authorizationInfo.setRoles(roleSet);
61                 
62                 //同理,根據用戶角色所擁有的權限,封裝數據,將唯一確定本條權限信息的String封裝為set,供shiro使用
63                 Set<Authority> authoritySet = role.getAuthorities();
64                 Set<String> auSet = new HashSet<String>();
65                 for (Authority authority : authoritySet) {
66                     auSet.add(authority.getAuthorityName());
67                 }
68                 authorizationInfo.setStringPermissions(auSet);
69                 return authorizationInfo;
70             }else{
71                 return null;
72             }
73             
74     }
75 
76     /**
77      * 用來驗證當前登錄的用戶,獲取認證信息 (對比是否可以成功登錄)
78      */
79     @Override
80     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
81         String username = (String) token.getPrincipal();//獲取用戶名
82         Criteria criteria = getSession().createCriteria(User.class);
83         criteria.add(Restrictions.eq("userName", username));
84         User user = userService.uniqueResult(criteria);
85         if(user != null){
86              AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(user.getUserName(), user.getPassword(), this.getName());
87              return authcInfo;
88         }else{
89             return null;
90         }
91     }
92 
93 }
View Code

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 }
View Code

 

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

 

 同理 測試其他的地址 即可!!!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM