TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
以上框架 可以说项目中基本都没有接触过除了hibernate、当然了那也是hibernate3。springMvc虽然接触过一点点 也是以前有时间做的小demo、根本不值一提。
% A5 G" w, G; z$ ]$ M
; X* S# E) ^5 J 因为现在接触的大都是S2SH、所以有时候就不太想接触新的事物、主要感觉现在的已经不错了、没必要去改变什么。最近也是急需补充自己、当然也是为了技术储备、更深入的了解各个框架、以后也可以适应各个公司的不同需求做准备。 & M- [# g( n* L
" v9 n6 o5 f j% Y4 I5 r E
Shiro 是 java 世界权限框架、以前听说过、但一直没有拿来实验、反正以前的后台权限基本为零或者乱七八糟的不好评论。
/ ^* ]" p8 f4 L
4 V a- w- U9 W 这里说一下HTTL(以前根本没有听说过)、这里淘宝的一位大牛开发的框架、可谓是一款国产开源框架。HTTL(Hyper-Text Template Language)是一个高性能的开源JAVA模板引擎,适用于动态HTML页面输出,可替代JSP页面,指令和Velocity相似。! q7 d+ R5 w, ]; G$ z
( p B' X' {, D1 {下面主要是一些常识性的介绍 秒懂的童靴可以略过。
6 v0 \( W/ P" V9 b4 E/ H0 T. @4 r+ r% E3 `3 `
1 F; e" N7 |6 R6 p+ \, [) X一、hibernate3和hibernate4的区别:6 g3 m4 Y# n# X; S& d; R8 c
Spring3.1去掉了HibernateDaoSupport类。hibernate4需要通过getCurrentSession()获取session。并且设置
4 `3 b X! Z. a, C1 a# { <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>" `6 C: O/ [1 s7 `7 a8 q7 Z+ |
(在hibernate3的时候是thread和jta)。 # ?) Y" M# X2 `
详细介绍:http://www.52itstyle.top/thread-7344-1-1.html
; p9 x3 g C, z* ?8 s0 ~1 L6 L' P1 s+ Z. o- S
二、Spring MVC和struts2的比较的优点:机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是 servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
- S0 A$ j8 j; H( I详细介绍:http://www.52itstyle.top/thread-7346-1-1.html' M e R& u5 Q6 m
* {9 A \! V) W5 y
2 f8 C# m% X X0 P二、HTTL详细介绍:
& Q! Q' ]. |! _) }将模板编译成JAVA字节码运行,并使用强类型推导,减少运行期反射和转型, 渲染速度接近Java硬编码输出,比Velocity等其它模板引擎快一个数量级。 比JSP也快,因为JSP只有Scriptlet是编译的,Tag和EL是解释执行的,而HTTL是全编译的。 7 p! U" b1 c4 Y
详细介绍:http://www.oschina.net/p/httl
, q0 X* G* S4 x: Fgithub地址: http://httl.github.io/zh/design.html
) M2 x- I1 J& Q5 I- {" I8 X. c% \
! f+ e* z3 Z1 ?, \" D
8 y+ B( { p) q四、 shiro安全框架" l- D) F# C- i3 c4 Q: ~! o
Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。本文就带领读者一睹 Shiro 的风采。 : S& u" E3 T' n+ p [0 y/ Q# ?- g
详细介绍:http://blog.csdn.net/boonya/article/details/8233303
5 {+ Q/ B! `5 H; s; ^跟我学Shiro目录:http://jinnianshilongnian.iteye.com/blog/201839810分钟教会你简单的使用Shiro:http://www.52itstyle.top/thread-7366-1-1.html9 _# f( k8 c; a9 p" H
=====================华丽的分割线===========================
2 l; L# k7 M% q* T9 r% I! o
& Z/ D2 P1 m! m5 V b. k* ] 好了 说了那么多、回到项目上来。搜遍全网也没有找到类似的可以参考的项目源码并且带jar包的、只是找了一个pom.xml以及相关配置、但是~没有源码。只能自己配置了。4 q1 T, G4 F# y) E, L
/ k, u% t: O+ W0 N. r2 F
: _) Q0 n* _+ o% s6 g
既然拿到pom.xml文件就好说了、下面就是搭建maven项目并下载所需jar包。一般的开发工具都会自带maven、只需相应的配置即可。 8 I4 O# @8 U' }4 E+ k
参考(http://jingyan.baidu.com/article/ea24bc39b1a8c7da63b33159.html)* x) ]; Z0 t0 h/ P
1 |) H* ^ a! I
一、shiro基本配置
- e' O0 } q0 Z& p) Q( r
9 x* i3 K7 k2 r1 gapplicationContext-shiro.xml:4 Z8 z( C" T1 y* l! H6 J& |# R
- <!-- 自动扫描-->
/ Y3 ~' Z! r4 |6 H. \8 b0 t - <context:component-scan base-package="com.*"/>
2 t9 ?" C% r+ w0 m, b. f - <!-- 用户授权/认证信息Cache, 采用EhCache 缓存-->
$ A. i' U) F# ]7 u) h1 s3 @, k - <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"># p8 e \/ w ]1 r. ?. s% L
- <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
4 v& n8 E. Y8 i. Z - </bean>1 X6 p h1 t2 C4 e6 j' P
- <!-- 继承自AuthorizingRealm的自定义Realm,即指定Shiro验证用户登录的类为自定义的UserRealm.java -->
! C' Q5 Y- J% @0 M( V# x - <bean id="shiroRealm" class="com.itstyle.web.realm.UserRealm"/>
7 Y; ^/ n, [: U; h% |( _: p; j - <!-- 基于Form表单的身份验证过滤器 -->$ L: }7 W4 K, F) a
- <bean id="formAuthenticationFilter"
9 P5 C. {3 I7 ?: G) P - class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">; k$ L$ z9 J+ X+ ]8 F6 N; j
- <property name="usernameParam" value="username" />
/ y- O( H8 X4 }. O+ \. F; j$ N2 c - <property name="passwordParam" value="password" />& d7 r6 H3 ~$ y8 D4 X
- <property name="loginUrl" value="/users/index.html" />
- M) J( s1 I" B1 k& P$ q6 ] - <property name="successUrl" value="/index/index.html" />
3 w9 q6 d% v X/ b3 Z/ F - </bean>
1 C# u+ J' b8 N1 `7 J- G - <bean
, `5 r6 N5 v& }9 ^1 \ - class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"3 z5 `. Y! C1 l- ]3 n0 l
- depends-on="lifecycleBeanPostProcessor">
* A1 _0 `5 a2 S d% I - <property name="proxyTargetClass" value="true" />- ^4 l$ U: I4 q& L- Z% s9 M
- </bean>
: v+ v8 K3 V+ W5 A; e. X, z -
3 x* a. e3 c+ D& B - <!-- securityManager工厂 这里主要是设置自定义的单Realm应用,若有多个Realm,可使用'realms'属性代替 -->* l( `7 e- w+ w Q- q
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">, J4 R8 D2 V! u1 H( V
- <property name="realm" ref="shiroRealm" />
6 }" ^! ]0 ?6 P# z - <property name="cacheManager" ref="shiroEhcacheManager" />/ L4 x8 l, x! m* C
- </bean>
5 N% @ i) D7 H' M* Z$ n - <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">2 h! u2 S- G& |
- <!-- 调用自定义的权限管理器 -->
& n3 a* s7 u2 x7 B8 b7 x3 w, ^ - <property name="securityManager" ref="securityManager" />
1 \$ Z& v6 [; K7 t# e - 9 f# @7 e: B. r4 }& g8 E
- <!-- 配置登陆成功后跳转地址 -->
- b- i0 \6 H; w) z ]1 | - <property name="successUrl" value="/index/index" />) r; W+ z9 k; S! H$ c% t
- 4 J2 B& ]. v+ {" a+ a' x
- <!-- 配置登陆时请求的地址 -->7 y* C U: f% o6 I( q# |
- <property name="loginUrl" value="/users/index" />
0 X/ y: m0 K# R- A8 Y% B* u+ |+ z - * ~& l" e. R7 a) u5 N" D: ^9 K
- E b2 F3 L: H- <!-- 如果请求的资源不再你的权限范围内,则跳转到error.htm -->
5 m( C5 |! A% w - <property name="unauthorizedUrl" value="/users/noAuth" />
* S# |! J$ b' ] - 6 m& F& f' }0 |
- <property name="filters">+ b' m" l) O9 t7 N5 I# [
- <map>% |9 H2 S! r% |* z# Y/ L
- <entry key="authc" value-ref="formAuthenticationFilter"></entry>' i' R+ B7 Q2 V" l9 P
- </map>
" z: t# I( |- F) Q+ {3 n - </property>
% ` Q9 \# O8 D6 V, x7 f7 x, \ - <property name="filterChainDefinitions">8 c: r( Y# L8 J6 @% G: ~0 E
- <value>
' h' g7 a: Z$ Q. E - <!-- anon表示此地址不需要任何权限即可访问 -->
9 R' N' \" ~& i9 |) }$ H - /users/*=anon8 J9 ]- N+ b1 o: l
- <!--login页面和logout页面不需要验证 -->2 T! v/ r/ Q8 e' `* \, \
- /login* = anon
2 O$ ~5 o5 C9 e+ E - <!--访问所有文件,authc必须通过验证后才能访问 -->
/ t2 ~& L# m- R1 W) r# r - /** = authc0 O, I) X/ n3 V, S
- </value>8 J) n* R9 j1 W" {' e4 {; x
- </property>* x7 L( ]" }+ q6 _& _
- </bean>+ c2 M- i% O1 a; c
- <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --># p! o! X9 D6 j
- <bean
" e9 K3 X: \3 T+ T5 F$ {) s - class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">& a% i# R/ P% z1 g
- <property name="staticMethod"
, m" H+ I! W# {0 K! J5 h - value="org.apache.shiro.SecurityUtils.setSecurityManager" />9 M+ l2 h2 z7 Y% Y( a/ n, Z
- <property name="arguments" ref="securityManager" />; C1 `8 \ Z9 p* G; Z3 u) f- M
- </bean>
( Q- A X4 C* K' J5 F& [4 w- j4 X - <!-- Shiro生命周期处理器 -->( B. g. U9 f3 t, f
- <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
复制代码
' R+ R# K6 L" F4 W. J4 m- ?UserRealm.java:
/ y, M7 N/ B7 {: ]6 I3 @% l- /**
) b" B/ t; r4 ? F - * 几个概念: 翻译不好,从官方上找来的原文. 如果不懂请 使用 “有道词典”。来源于: http://shiro.apache.org/java-authentication-guide.html! c5 J7 ?( v. S6 J! m5 ?; T
- * % o" ~; {+ r* T6 T( V4 I$ H
- * Subject Security specific user 'view' of an application user. It can be a human being, a third-party process, 9 O( _. x1 ?. t" [8 `
- * a server connecting to you application application, or even a cron job. Basically, it is anything or 3 X/ `% w( h+ T
- * anyone communicating with your application.
$ E/ c6 N' f) h7 H- ]4 ^) d - * " u& ]: f; N5 Y
- * Principals A subjects identifying attributes. First name, last name, social security number, username
5 {3 T* [' `5 u# k3 p - *
# ^" S- x `6 x* k' G2 k - * Credentials secret data that are used to verify identities. Passwords, Biometric data, x509 certificates,% k0 X" x# O( k4 d$ L) I& Z
- *
& k! J$ v3 B# Q0 w+ z+ P. f# N - * Realms Security specific DAO, data access object, software component that talkts to a backend data source. ! B5 [' o+ e4 D K# V6 ~
- * If you have usernames and password in LDAP, then you would have an LDAP Realm that would communicate
. |9 @* }) \. x: p - * with LDAP. The idea is that you would use a realm per back-end data source and Shiro would know how
* l8 f8 @' n. q8 p. I! _3 H/ X - * to coordinate with these realms together to do what you have to do.
& h' i& {0 }* v4 G - *7 w& P( c# I" c7 N/ }* }& E. `
- */$ h/ ]) W% W, p
- public class UserRealm extends AuthorizingRealm {
) W5 G2 p: e1 [% W - @Resource- w6 q* n7 A( i. j% l. L+ K* o
- private IUserService userService;
' e( \5 `* K- a- S -
5 x" r/ P% O2 T5 y2 T7 K( z - /*
( r! A* Q/ p: u2 G" z - * 权限认证, p: _) E6 t1 K7 D8 t/ R, Y
- */
5 A( S& S& z$ l: g$ j4 d! G - @Override- J. V. }% Q8 r; \" I9 s& l
- protected AuthorizationInfo doGetAuthorizationInfo(1 Z" P9 i+ r8 O* x. A
- PrincipalCollection principals) {
6 v7 ^3 K. p( p- @/ N. P - SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
8 Y, u4 V' m6 _( N - List<String> roles = new ArrayList<String>();
0 V( T% @+ f$ D, e/ Z - List<String> permissions = new ArrayList<String>();
/ Q% t. T/ C7 J% A+ i# h2 w" y - System.out.println("由于加入了缓存, 此处只会load一次 ");
/ E- x. J* R9 Q* Q: O7 P2 E - try {
- S6 `4 a. f7 a; G3 R1 a2 X5 A' T - Subject subject = SecurityUtils.getSubject();) b" y9 s: z# `6 F" P3 @+ |# R' z
- User user = (User) subject.getSession().getAttribute("user");
7 _- q$ h4 G, t, X& H( m' W! v0 X s" R - if(user!=null){
8 o. r# F, N3 Y5 y* P5 K s: N - if(user != null){
v: P4 L6 e+ _8 x4 S" o9 ? - List<Role> roleList = user.getRoleList();, [# W% L: {) ?/ V4 b
- if (!roleList.isEmpty()) {
9 B6 m/ H( k! ]3 o) r - for (Role role : roleList) {
) s5 F$ D4 ^, ?2 F9 d - roles.add(role.getRolename());
" Z: G; G2 n U" ?! i - List<Permission> prmissionList = role.getPermissionList();
6 J0 d) J, O2 W ~6 n* @ - if (!prmissionList.isEmpty()) {: A4 R8 P: `. R% U- ]. R8 a; o
- for (Permission pmss : prmissionList) {
) |, I$ q4 U, f. f - if(!StringUtils.isEmpty(pmss.getPermissionname())){
: \. x. Q! Q' ?. x: l) l - permissions.add(pmss.getPermissionname());
8 T, w8 E0 x( Z3 R2 | - }
" Q( F/ V. d7 ~# ~1 ~# K: N! x - }
h Y4 e' m* b - }+ q; @; A# K. X
- }6 @7 J- u4 m) _& G! Z- }( z* S
- }
( c' s+ t+ h( g5 a' o! V7 \ - //给当前用户设置角色
. O F# J2 v' C/ S, F# ~0 N& V! } - info.addRoles(roles);
' I8 X7 E$ T! W/ D5 Z5 a; P - //给当前用户设置权限
; p3 y* C& e1 `+ h$ g2 C' e' P - info.addStringPermissions(permissions);& W, z* P% W4 Y$ g- O6 i
- }else{
" R5 V0 b; u3 k [, I" t - throw new AuthorizationException();: B# ]4 x; f. z9 |2 c h4 B
- }
7 g; _2 b$ m( B7 c! u/ h6 | - }) ]6 B6 I$ [% [0 l1 K3 M/ h2 l, a
- } catch (Exception e) { |$ e! s% t2 o2 Z
- e.printStackTrace();
H5 u' F8 n) N& H4 a' x5 Y# Y - }
+ N" V$ Y5 q5 s7 K& I' _ - return info;/ t; G: H" K; c/ X+ k( N
- }
8 A5 ~" V( j7 H8 _0 a2 ?2 F/ Z - /*
1 k1 y0 `/ k/ F. A$ y; z - * 登陆认证( p* C" F. |: N: v. B, c
- */
/ Z& B1 @# \" p3 h0 s, k - @Override
( F g/ J7 S; X - protected AuthenticationInfo doGetAuthenticationInfo(
# b( r1 L3 `# v, Y) P% y) x& Q# m - AuthenticationToken authcToken) throws AuthenticationException {, p1 }1 h8 P# Y5 q
- UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
1 e& a* f( j; @4 O - String username=(String) token.getPrincipal();//用户名
# J7 P3 f# w# H( F - try {" v6 F' N0 m3 I/ f
- User user = userService.getUser(username);+ X5 G, n0 D# I8 E! c, c
- if (user != null) {
6 w5 @; r- O% Q& h% x - //获取session并保存到session中, ?/ d6 w7 {- C
- Subject subject = SecurityUtils.getSubject();3 `( z4 b8 S$ _: K
- //subject.login(authcToken);
( `9 r7 ?. w6 m - organizeRole(user);//组织用户权限& |& A" G% Y. `( {3 p
- subject.getSession().setAttribute("user", user);0 c& k0 g- F& T! ]( b9 Y. x
- //如果身份认证验证成功,返回一个AuthenticationInfo实现;
& {, S7 Q/ f- e5 _ - return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); ! B- I- f$ y$ _
- }( y; f/ M2 u+ A) x0 U
- }catch (Exception e ) {
5 l1 J8 V- l+ R# Z( X - //系统异常
, t; p( ~6 X. K' N' ^ - }' C' S/ ^) C w3 f- }( i# r1 Y
- return null;1 a7 z; D( T9 p# L: @- k
- }6 b, z1 F: m( F+ C; \: e( @9 c/ }4 [
- /*
2 A2 k0 ?: U4 X) [) j0 J V - * 组织用户权限 这里默认使用配置 后期读取配置文件 或者数据库- M2 U/ N4 D" O, o: f6 A
- */* _5 ]% E o3 f: Q' l# _, o1 V
- public void organizeRole(User user){& K- z0 t' j6 i @8 @% Z) G
- Short roleNum = user.getRole();
4 H4 S4 i' M) {: Q: e - if(roleNum==1){//管理员
/ o1 n$ u0 B- H) G! B( i# F - List<Role> roleList = new ArrayList<Role>();, s( f& a/ A$ Y0 V8 R; {/ d2 A
- List<Permission> permissionList = new ArrayList<Permission>();5 g4 E# S8 j# Z D! s# m
- Permission permission = new Permission(1,"manager");
6 D4 s. V1 T a n7 u - permissionList.add(permission);
! O! ]2 Z& Z4 J' j1 M8 T$ j - Role role = new Role (1,"admin",permissionList);
' `4 [; w K1 s/ h W2 n - roleList.add(role);
, E$ j# L8 L5 K3 N; `$ U - user.setRoleList(roleList);+ M+ n: d# @0 M) `, d
- }else{//普通用户1 Q+ k/ s' `9 o- K- I( L
- List<Role> roleList = new ArrayList<Role>(); H* U0 R& R# b; n3 U# C+ }
- List<Permission> permissionList = new ArrayList<Permission>();
; X( ~# t3 v6 k4 U4 T3 i* c - Permission permission = new Permission(1,"user");# ]; V- D" C- f o; t9 t1 |
- permissionList.add(permission); e& ]$ ?: {' r* _4 R! r' J5 z9 A' x9 m4 G
- Role role = new Role (1,"user",permissionList);
& p. z7 R$ N( N- p; }+ N - roleList.add(role);) N% ]9 X' P2 w& H
- user.setRoleList(roleList);9 b( l5 l, S' s0 c
- }; A# ~- D$ P5 j1 v
- }
# r+ K+ U( V6 K; v. V1 X, m - }
复制代码 6 @* _' k/ D% g2 f
由于每次权限验证都要重新组织 这里加入了ehcache缓存配置 加入 securityManager工厂即可% Q q: ~" k# G* u8 \9 p
ehcache-shiro.xml:
* e2 ?5 f4 F, }5 W; h& z: F- <ehcache updateCheck="false" name="shiroCache">
6 U! \7 c( h% L" N
# H0 ]& k8 V! \6 k2 w f- <defaultCache
# D4 }" ]% w) ^3 y6 r. w - maxElementsInMemory="10000"% a) r# Y% D3 l$ e7 h3 T3 U
- eternal="false"/ h5 }; ~* Y! I/ @7 y
- timeToIdleSeconds="120"* C3 }: X& M" _7 f
- timeToLiveSeconds="120"
! ]+ d3 U+ Y6 I k - overflowToDisk="false"
. B; q1 _# V& x) n& L7 m! i; g, @ - diskPersistent="false"1 L+ t- D$ \' S- Z C
- diskExpiryThreadIntervalSeconds="120"
$ C2 _" X6 [5 {$ X# d# A - />
& ^/ g3 u e. Q& y1 C& Z - </ehcache>
复制代码 spring-mvc.xml配置:" W3 t8 S @7 b
- <!-- 启用SpringMVC的注解功能,它会自动注册HandlerMapping、HandlerAdapter、ExceptionResolver的相关实例 -->+ q7 ]7 F5 A. I1 P4 Z6 b0 T
- <mvc:annotation-driven/>
+ a4 s) K+ |: j$ A* D+ L# ~ - <!-- 自动扫描-->
) [8 I0 H6 P5 F - <context:component-scan base-package="com.*"/>
4 |% u2 S" K ~ - <!-- 配置SpringMVC的视图解析器 httl视图 -->
; v. q" B% ~& v# i. M7 G - <bean id="viewResolver" class="httl.web.springmvc.HttlViewResolver">; a% C6 _( } H1 U, |$ r4 o
- <property name="contentType" value="text/html; charset=UTF-8" /> }: I% a- n: _. q- y' K' n
- </bean>; V0 ?! v+ j" H- [ E' U
' I) b# K( W0 r; A; U# k: X- <!-- 在spring-mvc.xml配置文件添加Shiro Spring AOP权限注解的支持: -->
) ^) b! ~, Y# D- X; C3 ]# F( Q - <aop:config proxy-target-class="true"></aop:config>
( N, J% G' r9 `; Y2 g( z - <bean
0 p- Y$ K; \% n% F/ l; e, I - class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
; W5 r/ L5 C: X$ v2 @ - <property name="securityManager" ref="securityManager" />
( L5 ?* M& ? d. L5 J - </bean>$ m$ X. F& M6 ?% y6 Z, A1 ?% }4 G
- <!-- 当前用户没有权限时跳转到的页面: -->; H& B+ p, p; h2 j, Y7 p
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 9 @8 m. J6 G7 @8 D; _6 O- H; U
- <property name="exceptionMappings"> & L$ ^4 D; D# i
- <props> 4 J! K0 E% G2 T
- <prop key="org.apache.shiro.authz.UnauthorizedException">/users/unauthorizedView</prop>
5 g# M! I2 L" Q" n - </props> 4 E0 f0 r( X, n( v" T
- </property> 7 ~. d+ B$ o8 j& i& Q
- </bean>
复制代码 httl.properties 配置:- import.packages+=com.itstyle.web.controller
0 K7 G [% }9 N9 K# b# l$ a - ! C' ?5 k$ v" u) y% Z
- template.directory=/WEB-INF/templates //模板存放地址
0 }3 B7 J u3 o3 z, m
- o1 T( `1 O* A( K- template.suffix=.httl* A8 Q+ K: e# G1 J$ D
- 2 r% B* }+ n, I( h$ d- |: L
- input.encoding=UTF-8
: r, |7 @' l5 h9 q- |' |1 \
# d4 @; j! H3 r1 n; q% O7 X! {- output.encoding=UTF-8//编码
. o [4 I& ^* E7 `* s$ B* h
v4 x* x0 ~$ H" g4 b- ^7 L8 d- reloadable=true
' N3 Y! o% D7 V& V - $ `5 Q) z/ A$ _; n* R" z
- precompiled=true* F& [7 ?4 [' X I% N* M1 _6 [
( Z r5 w" h: Z' ^! |# Q- compiler=httl.spi.compilers.JavassistCompiler3 c3 M2 i& r9 a" e% r
- import.methods+=com.itstyle.web.hiro.ShiroKit<span style="line-height: 1.5;">//前台导包类 主要判断权限</span>
复制代码
' S( D% o& D4 N
m9 n4 p* M* msping4Mvc+hibernate4+shiro+httl+maven整合项目源码1 V2 E- |7 U6 e
. Y+ A6 j7 O0 S7 K3 k
提取码:
下载地址.txt
(52 Bytes, 下载次数: 8, 售价: 10 IT币)
8 e; Q0 K, w+ M3 o8 `! N) d0 V0 B9 N8 U( I/ X2 w
|
|