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