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