From 10afb83c70c4caf235fa80b4cedb1b09823b774a Mon Sep 17 00:00:00 2001 From: jiangjiazhi Date: Fri, 3 Jun 2016 14:52:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/web/session/SessionProvider.java | 100 +++++++++++++++++++++ .../web/session/strategy/ISessionProvider.java | 48 ++++++++++ .../strategy/LocalCacheSessionStrategy.java | 90 +++++++++++++++++++ .../web/session/strategy/UserCenterStrategy.java | 69 ++++++++++++++ 4 files changed, 307 insertions(+) create mode 100644 platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/SessionProvider.java create mode 100644 platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/ISessionProvider.java create mode 100644 platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/LocalCacheSessionStrategy.java create mode 100644 platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/UserCenterStrategy.java diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/SessionProvider.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/SessionProvider.java new file mode 100644 index 0000000..78fb6dc --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/SessionProvider.java @@ -0,0 +1,100 @@ +package com.lyms.platform.operate.web.session; + +import com.lyms.platform.common.base.LoginContext; +import com.lyms.platform.operate.web.session.strategy.ISessionProvider; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +/** + * session 能力提供 + *

+ *

+ * Created by Administrator on 2016/6/2 0002. + */ +public class SessionProvider implements ISessionProvider { + /** + * 配置 + */ + private Map iSessionProviderMap; + /** + * 默认的session提供 + */ + private ISessionProvider defaultSessionProvider; + /** + * 当前策略 + */ + private String currentStrateger; + + public String getCurrentStrateger() { + return currentStrateger; + } + + public void setCurrentStrateger(String currentStrateger) { + this.currentStrateger = currentStrateger; + } + + public ISessionProvider getDefaultSessionProvider() { + return defaultSessionProvider; + } + + public void setDefaultSessionProvider(ISessionProvider defaultSessionProvider) { + this.defaultSessionProvider = defaultSessionProvider; + } + + public Map getiSessionProviderMap() { + return iSessionProviderMap; + } + + public void setiSessionProviderMap(Map iSessionProviderMap) { + this.iSessionProviderMap = iSessionProviderMap; + } + + @Override + public LoginContext checkSession(HttpServletRequest request, HttpServletResponse response, String token) { + ISessionProvider iSessionProvider = iSessionProviderMap.get(currentStrateger); + if (null != iSessionProvider) { + return iSessionProvider.checkSession(request, response, token); + } + if (null != defaultSessionProvider) { + return defaultSessionProvider.checkSession(request, response, token); + } + return null; + } + + @Override + public void removeSession(String token) { + ISessionProvider iSessionProvider = iSessionProviderMap.get(currentStrateger); + if (null != iSessionProvider) { + iSessionProvider.removeSession(token); + } + if (null != defaultSessionProvider) { + defaultSessionProvider.removeSession(token); + } + } + + @Override + public LoginContext login(String account, String password, String code) { + ISessionProvider iSessionProvider = iSessionProviderMap.get(currentStrateger); + if (null != iSessionProvider) { + return iSessionProvider.login(account, password, code); + } + if (null != defaultSessionProvider) { + return defaultSessionProvider.login(account, password, code); + } + return null; + } + + @Override + public LoginContext register(String userId, String phone, String account, String pwd) { + ISessionProvider iSessionProvider = iSessionProviderMap.get(currentStrateger); + if (null != iSessionProvider) { + return iSessionProvider.register(userId, phone, account,pwd); + } + if (null != defaultSessionProvider) { + return defaultSessionProvider.register(userId, phone, account, pwd); + } + return null; + } +} \ No newline at end of file diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/ISessionProvider.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/ISessionProvider.java new file mode 100644 index 0000000..a545ec2 --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/ISessionProvider.java @@ -0,0 +1,48 @@ +package com.lyms.platform.operate.web.session.strategy; +import com.lyms.platform.common.base.LoginContext; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * 提供验证session的方法 + * + * Created by Administrator on 2016/6/2 0002. + */ +public interface ISessionProvider { + + /** + * 检查session + * + * @param request + * @param response + * @param token + * @return + */ + LoginContext checkSession(HttpServletRequest request,HttpServletResponse response,String token); + + /** + * 删除session + * @param token + */ + void removeSession(String token); + + /** + * 登录 + * + * @return + */ + LoginContext login(String account,String password,String code); + + /** + * 注册 + * + * @param userId + * @param phone + * @param account + * @param pwd + * @return + */ + LoginContext register(String userId, String phone,String account, String pwd); +} diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/LocalCacheSessionStrategy.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/LocalCacheSessionStrategy.java new file mode 100644 index 0000000..e26f580 --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/LocalCacheSessionStrategy.java @@ -0,0 +1,90 @@ +package com.lyms.platform.operate.web.session.strategy; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.lyms.platform.common.base.LoginContext; +import com.lyms.platform.common.enums.YnEnums; +import com.lyms.platform.common.exception.TokenException; +import com.lyms.platform.common.utils.MD5Utils; +import com.lyms.platform.common.utils.TokenUtils; +import com.lyms.platform.permission.model.Users; +import com.lyms.platform.permission.model.UsersQuery; +import com.lyms.platform.permission.service.UsersService; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * 本地session缓存策略 + *

+ * Created by Administrator on 2016/6/2 0002. + */ +public class LocalCacheSessionStrategy implements ISessionProvider { + @Autowired + private UsersService usersService; + + private String preFix = "luc"; + + private Map localSessionCache = new ConcurrentHashMap<>(); + + public static Cache cache = CacheBuilder.newBuilder() + .expireAfterAccess(30, TimeUnit.MINUTES) + .build(); + + @Override + public LoginContext checkSession(HttpServletRequest request, HttpServletResponse response, String token) { + LoginContext loginContext = cache.getIfPresent(token); + if(null==loginContext||!loginContext.isLogin()) { + throw new TokenException(); + } + Users users = usersService.getUsers(loginContext.getId()); + if(null == users) { + throw new TokenException(); + } + request.setAttribute("loginContext", loginContext); + return loginContext; + } + + @Override + public void removeSession(String token) { + /*cache.remove(token);*/ + } + + + @Override + public LoginContext login(String account, String password, String code) { + + UsersQuery membersQuery = new UsersQuery(); + membersQuery.setAccount(account); + membersQuery.setPwd(MD5Utils.md5(password).toUpperCase()); + membersQuery.setYn(YnEnums.YES.getId()); + //本地版本忽略code没有短信验证码 + List membersList = usersService.queryUsers(membersQuery); + LoginContext loginContext = new LoginContext(); + loginContext.setErrormsg("用户不存在."); + loginContext.setErrorcode(4003); + if (CollectionUtils.isNotEmpty(membersList)) { + Integer userId = membersList.get(0).getId(); + loginContext.setId(userId); + String token = preFix + TokenUtils.getToken(UUID.randomUUID().toString()); + loginContext.setToken(token); + loginContext.setErrorcode(0); + loginContext.setErrormsg("登录成功"); + cache.put(token, loginContext); + } + return loginContext; + } + + @Override + public LoginContext register(String userId, String phone, String account, String pwd) { + LoginContext loginContext = new LoginContext(); + return loginContext; + } +} diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/UserCenterStrategy.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/UserCenterStrategy.java new file mode 100644 index 0000000..b95d7ab --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/session/strategy/UserCenterStrategy.java @@ -0,0 +1,69 @@ +package com.lyms.platform.operate.web.session.strategy; + +import com.lyms.platform.common.base.LoginContext; +import com.lyms.platform.common.exception.TokenException; +import com.lyms.platform.common.utils.LoginUtil; +import com.lyms.platform.permission.model.Users; +import com.lyms.platform.permission.service.UsersService; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 基于用户中心的登录策略 + * + * Created by Administrator on 2016/6/2 0002. + */ + +public class UserCenterStrategy implements ISessionProvider { + @Autowired + private UsersService usersService; + @Value("#{configProperties['login.token']}") + private String token; + @Value("#{configProperties['login.typeId']}") + private String typeId; + @Override + public LoginContext checkSession(HttpServletRequest request, HttpServletResponse response,String token) { + LoginContext loginContext = LoginUtil.checkLoginState(token); + if(!loginContext.isLogin()) { + throw new TokenException(); + } + Users users = usersService.getUsersByLoginCenterId(loginContext.getId()); + if(null == users) { + throw new TokenException(); + } + loginContext.setId(users.getId()); + loginContext.setToken(token); + request.setAttribute("loginContext", loginContext); + return loginContext; + } + + @Override + public void removeSession(String token) { + if(StringUtils.isNotEmpty(token)){ + LoginUtil.deleteToken(token); + } + } + + @Override + public LoginContext login(String account, String password,String code) { + LoginContext loginContext = new LoginContext(); + loginContext.setErrormsg("服务器内部错误!"); + loginContext.setErrorcode(-1); + if(null != code) { + loginContext =LoginUtil.loginByPhone(account, code, typeId, token); + } + if(null != password) { + loginContext = LoginUtil.loginByAccount(account, password, typeId, token); + } + return loginContext; + } + + @Override + public LoginContext register(String userId, String phone, String account, String pwd) { + return LoginUtil.register(null, phone,account, pwd, token, typeId); + } +} \ No newline at end of file -- 1.8.3.1