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