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