表结构
资源表:
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();
}
}