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