根据自己对项目的理解总结的,仅供自己参考!!
项目中有些数据不经常变化,用的有比较频繁,查询起来又比较耗时,所以在容器启动的时候对其进行初始化,然后放在ServletContext getContext.setAttribute共全局使用:
一、在web.xml 中配置监听器:
<listener>
<listener-class>com.geo.dsp.webapp.listener.StartupListener</listener-class>
</listener>
StartupListener继承ServletContextListener,在contextInitialized方法里面对所需的数据赋值,大致代码如下:
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);①
LookupManager mgr = (LookupManager) ctx.getBean("lookupManager");②
//菜单权限验证类
DspMenuPerssionAdapter dspPermissionAdapter = new DspMenuPerssionAdapter();③
context.setAttribute(DspMenuPerssionAdapter.DSPMENUPERSSION, dspPermissionAdapter);
//全部菜单
List<Menu>allMenus = mgr.getAllMenus();
Map<String,Menu> menuMap = new HashMap<String,Menu>();
for(Menu menu:allMenus){
if(menu.getAction()!=null){
menuMap.put(menu.getAction().toLowerCase(), menu);
}else{
menuMap.put(menu.getName().toLowerCase(), menu);
}
}
context.setAttribute("MENUMAP", menuMap);
context.setAttribute(Constants.AVAILABLE_MENUS, allMenus);
解释:①处通过Spring提供的工具类获取ApplicationContext对象。对于获取方法,可以参考此文 章:http://www.blogjava.net/Todd/archive/2010/04/22/295112.html
②获取所需要的实例类,这里lookupManager接口如下:
public interface LookupManager {
List<Role> getAllRoles();
List<Menu>getAllMenus();
List<Provider>getAllProviders();
}这里是需要初始化的数据。
③dspPermissionAdapter 类判断当前登录用户所能看到的菜单(项目菜单用struts menu 实现,包含权限控制),此类用到 org.springframework.security.core.Authentication。代码如下:
public class DspMenuPerssionAdapter implements PermissionsAdapter,Serializable {
/**
*
*/
private static final long serialVersionUID = 1921930077070193606L;
public static final String DSPMENUPERSSION="dspMenuPerssion";
//用户验证信息
private Authentication aut = null;
//用户拥有的菜单集合
private HashMap<String,Menu> menuMap = new HashMap<String, Menu>();
public void setAut(Authentication aut) {
this.aut = aut;
if(this.aut==null){
return;
}
//System.out.println("current user : ");
//System.out.print(DspContextHolder.getContext().getCurrentUser().getFullName());
User user = (User)this.aut.getPrincipal();
menuMap.clear();
Set<Role> roles= user.getRoles();
for(Role role1:roles){
Set<Menu> menus = role1.getMenus();
for(Menu menu1 :menus){
menuMap.put(menu1.getName(), menu1);
}
}
}
public boolean isAllowed(MenuComponent menu) { //展示菜单的时候回调用此方法判断此菜单是否对该用户显示(项目中的菜单是程序拼接的一段JS代码)
if(menuMap.containsKey(menu.getName())){
return true;
}
return false;
}
}