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