java 登录获取资源菜单

表结构

资源表:

create table PERMISSION
(
  permission_id    NUMBER not null,
  permission_value VARCHAR2(60) not null,
  permission_name  VARCHAR2(60) not null,
  permission_desc  VARCHAR2(100),
  permission_type  VARCHAR2(1),
  flay             VARCHAR2(2)
)

在这里插入图片描述
角色表:

create table ROLES
(
  role_id   NUMBER not null,
  role_type VARCHAR2(1),
  name      VARCHAR2(60) not null,
  descr     VARCHAR2(100),
  cretime   VARCHAR2(14) not null,
  creator   VARCHAR2(20) not null
)

在这里插入图片描述
资源角色关系表:

create table ROLE_PERMISSION_MAPPING
(
  id_num        NUMBER not null,
  role_id       VARCHAR2(32) not null,
  permission_id NUMBER not null
)

在这里插入图片描述

代码

用户登录根据角色获取资源,显示树形菜单

public class LoginConst {
	public final static String LOGIN_USER_MODEL = "loginUserModel";
	public final static String USER_LOGIN_DATE = "userLoginDate";
	public final static String LOGOUT_TIP_MODEL = "tipModel";
}
public void sessionPut(String name, Object value) {
		WebUtil.sessionPut(name, value);
	}
Collection   collection=permissionMapper.getPromissionListByUserId(bean.getUserId());
 		if(collection != null){
 		  Iterator it = collection.iterator();
 		  Hashtable table = new Hashtable();
 		  while(it.hasNext()){
 			  Permission permission = (Permission) it.next();
 		      table.put(permission.getPermissionValue(),"1");
 		      }
 		      userModel.setPermissions(table);
 		  }else{
 		      userModel.setPermissions(new Hashtable());
 		  }
       
 		//加载树菜单
 		String treeJson = TreeApp.getInstance().genMenu(userModel.getPermissionsList(), "/treeMenu.xml");
 		userModel.setTreeJson(treeJson);
 		SessionFacade.setUserLogin(userModel);
         
         //在commonLogAdvice拦截之前把登陆信息放进session
        sessionPut(LoginConst.LOGIN_USER_MODEL,userModel);
 		sessionPut(LoginConst.USER_LOGIN_DATE , DateTimeUtil.getStandCurrentDate());

treeMenu.xml

<?xml version="1.0" encoding="UTF-8"?>
<menu>
	<expanded>Opened</expanded>
	<directory>
		<caption>系统管理</caption>
		<expanded>Closed</expanded>
			<item>  
				<permission>USER_MANAGE</permission>
				<caption>用户管理</caption>
				<url><![CDATA[
				        ../../../user/init
					]]>
				</url>
				<target>center</target>
			</item>
			 <item>  
				<permission>ROLE_MANAGE</permission>
				<caption>角色管理</caption>
				<url><![CDATA[
				       ../../../roles/init
					]]>
				</url>
				<target>center</target>
			</item> 
 			
			<item>  
				<permission>SYSPARAM</permission>
				<caption>系统参数管理</caption>
				<url><![CDATA[
				       ../../../sysparam/init
					]]>
				</url>
				<target>center</target>
			</item>
			
			<item>  
				<permission>SYSMAC</permission>
				<caption>系统秘钥管理</caption>
				<url><![CDATA[
				       ../../../sysmac/init
					]]>
				</url>
				<target>center</target>
			</item>
	</directory> 
	
 <directory>
		<caption>文件发布</caption>
		<expanded>Closed</expanded>
			<item>  
				<permission>FILE_RELEASE</permission>
				<caption>文件发布</caption>
				<url><![CDATA[
				        ../../../upload/init
					]]>
				</url>
				<target>center</target>
			</item>
	</directory>
</menu>

SessionFacade:

package com.mp.common.util;

import java.util.Hashtable;

import javax.servlet.http.Cookie;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mp.common.bean.model.SingleLoginCheckResultModel;
import com.mp.core.tool.WebUtil;
import com.mp.isrp.bean.model.UserModel;

public class SessionFacade {

	private static Logger logger = LoggerFactory.getLogger(SessionFacade.class);

	private static Hashtable userLoginRegTb = new Hashtable();
	
	private static Hashtable sessionTb = new Hashtable();

	public static void setUserLogin(UserModel user) {
		Cookie cookie = new Cookie(SingleLoginConst.USER_COOKIE_NAME, user.getId());
		cookie.setMaxAge(SingleLoginConst.COOKIE_TIME);
		cookie.setPath(WebUtil.getRequest().getContextPath());
		WebUtil.getResponse().addCookie(cookie);
		
		UserModel oldUser = getUserModel(WebUtil.getSession().getId());
		oldUser.setId(user.getId());
		oldUser.setName(user.getName());
		oldUser.setLoginFlag(true);
		oldUser.setPermissions(user.getPermissions());
		oldUser.setUnitId(user.getUnitId());
		oldUser.setUnitName(user.getUnitName());
		oldUser.setUserType(user.getUserType());
		oldUser.setLastLoginTime(user.getLastLoginTime());
		oldUser.setPwdModifyTime(user.getPwdModifyTime());
		oldUser.setPwdValidTime(user.getPwdValidTime());
		oldUser.setRolesLevel(user.getRolesLevel());
		
		synchronized (userLoginRegTb) {
			userLoginRegTb.put(oldUser.getId(), oldUser.getSessionId());
		}

	}

	public static void setUserLogout(UserModel user) {
		Cookie cookie = new Cookie(SingleLoginConst.USER_COOKIE_NAME, "");
		cookie.setMaxAge(SingleLoginConst.COOKIE_TIME);
		cookie.setPath(WebUtil.getRequest().getContextPath());
		WebUtil.getResponse().addCookie(cookie);

		synchronized (sessionTb) {
			sessionTb.remove(WebUtil.getSession().getId());
		}
		
		synchronized (userLoginRegTb) {
			userLoginRegTb.remove(user.getId());
		}
		WebUtil.getSession().invalidate();		
	}

	public static void setUserLogOutAfterTimeOut(String sessionId) {
		UserModel user = getUserModel(sessionId);
		
		synchronized (sessionTb) {
			sessionTb.remove(sessionId);
		}
		
		synchronized (userLoginRegTb) {
			userLoginRegTb.remove(user.getId());
		}
	}
	
	/**
	 * 强制用户退出
	 * @param userId
	 */
	public static void forceUserLogout(String userId){
		String sessionId = (String) userLoginRegTb.get(userId);
		sessionTb.remove(sessionId);
		userLoginRegTb.remove(userId);
	}

	public static SingleLoginCheckResultModel singleLoginCheck(String userId) {
		SingleLoginCheckResultModel model = new SingleLoginCheckResultModel();
		String loginUserId = "";
		String checkFailReason = "";
		boolean result = true;

		/* 先从客户端读取cookie获取已经登陆或曾经登陆过的用户id */
		String cookieUserId = null;
		Cookie[] cookies = WebUtil.getRequest().getCookies();
		for (int i = 0; i < cookies.length; i++) {
			Cookie cookie = cookies[i];
			if (SingleLoginConst.USER_COOKIE_NAME.equals(cookie.getName())) {
				cookieUserId = cookie.getValue();
				break;
			}
		}

		/* 判断同一台机是否有两个用户登陆 */
		if (cookieUserId != null
				&& !cookieUserId.equals("")
				&& !userId.equals(cookieUserId)
				&& UserConfig.getInstance().getConfigValue(UserConfigKey.SINGLE_MACHINE_LOGIN).toString()
					.equals(SingleLoginConst.SINGLE_MACHINE_LOGIN_TRUE)) {
			logger.error("用户名为" + userId
					+ "已经登陆,不能在同一台机器上有两个用户登陆!");
			result = false;
			loginUserId = cookieUserId;
			checkFailReason = SingleLoginConst.SINGLE_MACHINE_LOGIN_FAIL_DESCR;
		}

		/* 判断同一用户是否重复登陆 */
		if (userLoginRegTb.containsKey(userId)
				&& UserConfig.getInstance().getConfigValue(UserConfigKey.SINGLE_USER_LOGIN).toString()
					.equals(SingleLoginConst.SINGLE_USER_LOGIN_TRUE)) {
			logger.error("用户名为" + userId
					+ "已经登陆,同一用户不能登陆两次!");
			result = false;
			loginUserId = userId;
			checkFailReason = SingleLoginConst.SINGLE_USER_LOGIN_FAIL_DESCR;
		}

		model.setResult(result);
		model.setLoginUserId(loginUserId);
		model.setCheckFailReason(checkFailReason);
		return model;
	}
	
	public static void singleLoginCheck1(String userId) {
        SingleLoginCheckResultModel model = new SingleLoginCheckResultModel();
        String loginUserId = "";
        String checkFailReason = "";
        boolean result = true;

        /* 先从客户端读取cookie获取已经登陆或曾经登陆过的用户id */
        String cookieUserId = null;
        Cookie[] cookies = WebUtil.getRequest().getCookies();
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            if (SingleLoginConst.USER_COOKIE_NAME.equals(cookie.getName())) {
                cookieUserId = cookie.getValue();
                break;
            }
        }

        /* 判断同一台机是否有两个用户登陆 */
        if (cookieUserId != null
                && !cookieUserId.equals("")
                && !userId.equals(cookieUserId)
                && UserConfig.getInstance().getConfigValue(UserConfigKey.SINGLE_MACHINE_LOGIN).toString()
                    .equals(SingleLoginConst.SINGLE_MACHINE_LOGIN_TRUE)) {
            logger.error("用户名为" + userId
                    + "已经登陆,不能在同一台机器上有两个用户登陆!");
            result = false;
            loginUserId = cookieUserId;
            checkFailReason = SingleLoginConst.SINGLE_MACHINE_LOGIN_FAIL_DESCR;
        }

        /* 判断同一用户是否重复登陆 */
        if (userLoginRegTb.containsKey(userId)
                && UserConfig.getInstance().getConfigValue(UserConfigKey.SINGLE_USER_LOGIN).toString()
                    .equals(SingleLoginConst.SINGLE_USER_LOGIN_TRUE)) {
            logger.error("用户名为" + userId
                    + "已经登陆,同一用户不能登陆两次!");
            result = false;
            loginUserId = userId;
            checkFailReason = SingleLoginConst.SINGLE_USER_LOGIN_FAIL_DESCR;
        }

        model.setResult(result);
        model.setLoginUserId(loginUserId);
        model.setCheckFailReason(checkFailReason);
    }
	
	public static boolean challengeCheck(String challenge){
		boolean result = true;
		
		UserModel user = getUserModel(WebUtil.getSession().getId());
		if(UserConfig.getInstance().getConfigValue(UserConfigKey.USE_CAPTCHA).toString().equals("1")){
			result = user.getCaptcha().validateResponse(challenge).booleanValue();
		}
		
		return result;
	}
	
	/**
	 * 新session创建时调用此方法
	 * @param sessionId
	 */
	public static void createSession(String sessionId){
		UserModel user = new UserModel();
		user.setId("");
		user.setLoginFlag(false);
		user.setSessionId(sessionId);
		
		synchronized(sessionTb){
			sessionTb.put(sessionId, user);
		}
	}
	
	public static UserModel getUserModel(String sessionId){
		UserModel user = (UserModel) sessionTb.get(sessionId);
		/*服务器正常停止后再启动,会自动重新加载sessionId,但这时应用的数据都没有了,因此需要重新创建*/
		if(user == null){
			createSession(sessionId);
			user = (UserModel) sessionTb.get(sessionId);
//			if(user.getCaptcha() == null){
//				user.setCaptcha(CaptchaUtil.getInstance().getNextImageCaptcha());
//			}
		}
		return user;
	}
	
	/**
	 * 判断用户是否已经登陆
	 * @param userId
	 * @return
	 */
	public static boolean isUserLogin(String userId){
		return userLoginRegTb.containsKey(userId);
	}

	public static Hashtable getUserLoginRegTb() {
		return userLoginRegTb;
	}

	public static void setUserLoginRegTb(Hashtable userLoginRegTb) {
		SessionFacade.userLoginRegTb = userLoginRegTb;
	}
	
	public static Hashtable getSessionTb() {
		return sessionTb;
	}

	public static void setSessionTb(Hashtable sessionTb) {
		SessionFacade.sessionTb = sessionTb;
	}

}

WebUtil:

package com.mp.core.tool;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class WebUtil {

	private static ThreadLocal<HttpServletRequest> request_threadLocal = new ThreadLocal<HttpServletRequest>();
	private static ThreadLocal<HttpServletResponse> reponse_threadLocal = new ThreadLocal<HttpServletResponse>();

	public static void setRequest(HttpServletRequest request) {
		request_threadLocal.set(request);
	}

	public static HttpServletRequest getRequest() {
		return request_threadLocal.get();
	}

	public static void removeRequest() {
		request_threadLocal.remove();
	}

	public static void setResponse(HttpServletResponse response) {
		reponse_threadLocal.set(response);
	}

	public static HttpServletResponse getResponse() {
		return reponse_threadLocal.get();
	}

	public static void removeResponse() {
		reponse_threadLocal.remove();
	}

	public static void sessionPut(String name, Object value) {
		getRequest().getSession().setAttribute(name, value);
	}

	public static Object sessionGet(String name) {
		return getRequest().getSession()
				.getAttribute(name);
	}

	public static void requestPut(String name, Object value) {
		getRequest().setAttribute(name, value);
	}

	public static Object requestGet(String name) {
		return getRequest().getAttribute(name);
	}

	public static void applicationPut(String name, Object value) {
		getRequest().getSession().getServletContext()
				.setAttribute(name, value);
	}

	public static Object applicationGet(String name) {
		return getRequest().getSession()
				.getServletContext().getAttribute(name);
	}

	public static HttpSession getSession() {
		return getRequest().getSession();
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值