本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订 。
关于细粒度权限控制的考量 - 江雨行 阅读原文»
权限控制可以说是每个项目的必备基础模块,不讨论RBAC和ACL,只是自己的想法。
我眼中的权限控制:
作用:用于控制功能或资源的访问,仅此而已。
无论是SpringMVC的拦截器,还是Struts的拦截器,拦截地址栏操作都是那么的简单。
问题在于如何将权限控制在页面级别,例如,按钮,某个资源元素等。
关于命名约定的问题:
例如添加功能:
@RequestMapping(value="/role/add.jhtml",RequestMethod=GET)
@RequestMapping(value="/role/add.jhtml",RequestMethod=POST)
这两者的请求路径是可以相同的。
这意味这什么?意味着只要定义好命名规则,动作级别的请求是可以被很好地拦截。
关于页面控制的问题:
无论你是JSP还是FreeMarker,你是不是都可以搞一个自定义标签,判断是否有权限访问,与是否显示呢?
本文链接:关于细粒度权限控制的考量,转载请注明。
通用缓存组件 - loncin 阅读原文»
缓存有很多种,用的最普遍的可能就是内存缓存了。内存缓存的实现方式也有很多种,比如用静态变量,比如用Cache,但这些方式只针对单一缓存变量,每个缓存变量都要重新写一套方法,无法实现通用。这里提供一种通用的内存缓存组件,不用再为每个缓存做实现了。
话不多说,先上代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Reflection;
5 using System.Text;
6 using System.Web;
7 using System.Web.Caching;
8
9 namespace Loncin.CodeGroup10.Utility
10 {
11 /// <summary>
12 /// 通用缓存组件
13 /// </summary>
14 public class CacheHelper
15 {
16 /// <summary>
17 /// 获取缓存对象
18 /// </summary>
19 /// <typeparam name="T">缓存实体对象</typeparam>
20 /// <param name="dele">实体数据获取方法</param>
21 /// <param name="cacheKey">缓存关键字</param>
22 /// <param name="cacheDuration">缓存时间(分钟)</param>
23 /// <param name="objs">实体数据获取参数</param>
24 /// <returns>返回对象</returns>
25 public static T GetCacheData<T>(Delegate dele, string cacheKey, int cacheDuration, params object[] objs)
26 {
27 // 缓存为空
28 if (HttpRuntime.Cache.Get(cacheKey) == null)
29 {
30 // 执行实体数据获取方法
31 MethodInfo methodInfo = dele.Method;
32
33 T result = (T)methodInfo.Invoke(dele.Target, objs);
34
35 if (result != null)
36 {
37 // 到期时间
38 DateTime cacheTime = DateTime.Now.AddMinutes(cacheDuration);
39
40 // 添加入缓存
41 HttpRuntime.Cache.Add(cacheKey, result, null, cacheTime, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null);
42 }
43 }
44
45 return (T)HttpRuntime.Cache[cacheKey];
46 }
47 }
48 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Reflection;
5 using System.Text;
6 using System.Web;
7 using System.Web.Caching;
8
9 namespace Loncin.CodeGroup10.Utility
10 {
11 /// <summary>
12 /// 通用缓存组件
13 /// </summary>
14 public class CacheHelper
15 {
16 /// <summary>
17 /// 获取缓存对象
18 /// </summary>
19 /// <typeparam name="T">缓存实体对象</typeparam>
20 /// <param name="dele">实体数据获取方法</param>
21 /// <param name="cacheKey">缓存关键字</param>
22 /// <param name="cacheDuration">缓存时间(分钟)</param>
23 /// <param name="objs">实体数据获取参数</param>
24 /// <returns>返回对象</returns>
25 public static T GetCacheData<T>(Delegate dele, string cacheKey, int cacheDuration, params object[] objs)
26 {
27 // 缓存为空
28 if (HttpRuntime.Cache.Get(cacheKey) == null)
29 {
30 // 执行实体数据获取方法
31 MethodInfo methodInfo = dele.Method;
32
33 T result = (T)methodInfo.Invoke(dele.Target, objs);
34
35 if (result != null)
36 {
37 // 到期时间
38 DateTime cacheTime = DateTime.Now.AddMinutes(cacheDuration);
39
40 // 添加入缓存
41 HttpRuntime.Cache.Add(cacheKey, result, null, cacheTime, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null);
42 }
43 }
44
45 return (T)HttpRuntime.Cache[cacheKey];
46 }
47 }
48 }
1、缓存组件方法接收一个获取原始数据方法委托,一个缓存key,一个缓存过期时间,以及获取原始数据方法参数;
2、缓存使用HttpRuntime.Cache实现,这是.net自带缓存组件,使用绝对缓存(当然根据需要也可以改成滑动缓存);
3、方法先从缓存获取数据,缓存未取到数据,执行原始数据方法委托,获取数据,并添加入缓存。
使用示例:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Loncin.CodeGroup10.Utility;
6
7 namespace Loncin.CodeGroup10.ConsoleTest.Test
8 {
9 /// <summary>
10 /// 通用缓存组件测试
11 /// </summary>
12 public class CacheHelperTest
13 {
14 /// <summary>
15 /// 测试方法
16 ///
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Loncin.CodeGroup10.Utility;
6
7 namespace Loncin.CodeGroup10.ConsoleTest.Test
8 {
9 /// <summary>
10 /// 通用缓存组件测试
11 /// </summary>
12 public class CacheHelperTest
13 {
14 /// <summary>
15 /// 测试方法
16 ///
没有评论:
发表评论