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