Commit 21c3e12b99088da494e6c377e60ff2af3e5e1ab6
1 parent
c6a1b775ac
Exists in
master
add token inteceptor
Showing 11 changed files with 442 additions and 11 deletions
- parent/core.sdk/src/main/java/com/lyms/annotation/TokenRequired.java
- parent/core.sdk/src/main/java/com/lyms/constants/Constants.java
- parent/core.sdk/src/main/java/com/lyms/context/ContextHolder.java
- parent/core.sdk/src/main/java/com/lyms/context/PlatformContext.java
- parent/core.sdk/src/main/java/com/lyms/util/IpUtils.java
- parent/hospital.mac/src/main/java/com/lyms/hospital/service/token/TokenService.java
- parent/hospital.mac/src/main/java/com/lyms/hospital/service/token/impl/TokenServiceImpl.java
- parent/hospital.web/src/main/java/com/lyms/hospital/inteceptor/TokenValidateInteceptor.java
- parent/hospital.web/src/main/java/com/lyms/hospital/session/ISessionProvider.java
- parent/hospital.web/src/main/java/com/lyms/hospital/session/SessionProvider.java
- parent/hospital.web/src/main/java/com/lyms/hospital/session/strategy/LocalRedisSessionStrategy.java
parent/core.sdk/src/main/java/com/lyms/annotation/TokenRequired.java
View file @
21c3e12
1 | +package com.lyms.annotation; | |
2 | + | |
3 | + | |
4 | +import java.lang.annotation.ElementType; | |
5 | +import java.lang.annotation.Retention; | |
6 | +import java.lang.annotation.RetentionPolicy; | |
7 | +import java.lang.annotation.Target; | |
8 | + | |
9 | +/** | |
10 | + * Created by Administrator on 2015/9/25 0025. | |
11 | + */ | |
12 | +@Target({ElementType.TYPE, ElementType.METHOD}) | |
13 | +@Retention(RetentionPolicy.RUNTIME) | |
14 | +public @interface TokenRequired | |
15 | +{ | |
16 | +} |
parent/core.sdk/src/main/java/com/lyms/constants/Constants.java
View file @
21c3e12
parent/core.sdk/src/main/java/com/lyms/context/ContextHolder.java
View file @
21c3e12
1 | +package com.lyms.context; | |
2 | + | |
3 | + | |
4 | + | |
5 | +/** | |
6 | + * 上下文持有 | |
7 | + * | |
8 | + * Created by Administrator on 2015/9/25 0025. | |
9 | + */ | |
10 | +public class ContextHolder | |
11 | +{ | |
12 | + | |
13 | + private static final ThreadLocal<PlatformContext> contextHolder =new ThreadLocal<PlatformContext>(); | |
14 | + | |
15 | + public static PlatformContext getContext (){ | |
16 | + PlatformContext context = contextHolder.get(); | |
17 | + if(null==context){ | |
18 | + throw new UnsupportedOperationException("请配置TokenRequired注解."); | |
19 | + } | |
20 | + return context; | |
21 | + } | |
22 | + | |
23 | + public static void setContext(PlatformContext context){ | |
24 | + if(null == context){ | |
25 | + throw new NullPointerException("context must not null."); | |
26 | + } | |
27 | + contextHolder.set(context); | |
28 | + } | |
29 | + public static void clean(){ | |
30 | + contextHolder.remove(); | |
31 | + } | |
32 | +} |
parent/core.sdk/src/main/java/com/lyms/context/PlatformContext.java
View file @
21c3e12
1 | +package com.lyms.context; | |
2 | + | |
3 | + | |
4 | +/** | |
5 | + * | |
6 | + * | |
7 | + * Created by Administrator on 2015/9/25 0025. | |
8 | + */ | |
9 | +public class PlatformContext | |
10 | +{ | |
11 | + | |
12 | + private String token; | |
13 | + | |
14 | + private String userId; | |
15 | + | |
16 | + private String ipAddr; | |
17 | + //当前登录人所在的医院id | |
18 | + private String hospitalId; | |
19 | + | |
20 | + public String getHospitalId() | |
21 | + { | |
22 | + return hospitalId; | |
23 | + } | |
24 | + | |
25 | + public void setHospitalId(String hospitalId) | |
26 | + { | |
27 | + this.hospitalId = hospitalId; | |
28 | + } | |
29 | + | |
30 | + public String getUserId() { | |
31 | + return userId; | |
32 | + } | |
33 | + | |
34 | + public void setUserId(String userId) { | |
35 | + this.userId = userId; | |
36 | + } | |
37 | + | |
38 | + public String getToken() { | |
39 | + return token; | |
40 | + } | |
41 | + | |
42 | + public void setToken(String token) { | |
43 | + this.token = token; | |
44 | + } | |
45 | + public String getIpAddr() { | |
46 | + return ipAddr; | |
47 | + } | |
48 | + | |
49 | + public void setIpAddr(String ipAddr) { | |
50 | + this.ipAddr = ipAddr; | |
51 | + } | |
52 | +} |
parent/core.sdk/src/main/java/com/lyms/util/IpUtils.java
View file @
21c3e12
1 | +package com.lyms.util; | |
2 | + | |
3 | +import javax.servlet.http.HttpServletRequest; | |
4 | +import java.net.InetAddress; | |
5 | +import java.net.UnknownHostException; | |
6 | + | |
7 | +/** | |
8 | + * 添加类的一句话简单描述。 | |
9 | + * <p/> | |
10 | + * 详细描述 | |
11 | + * <p/> | |
12 | + * 示例代码 | |
13 | + * <pre> | |
14 | + * </pre/> | |
15 | + * | |
16 | + * @author JIAZHI.JIANG | |
17 | + * @version BME V100R001 2017-04-10 14:22 | |
18 | + * @since BME V100R001C40B104 | |
19 | + */ | |
20 | +public class IpUtils | |
21 | +{ | |
22 | + | |
23 | + | |
24 | + /** | |
25 | + * <li>@Description:获取客户端IP | |
26 | + * <li>@param request | |
27 | + * <li>@return | |
28 | + * <li>创建人:方承 | |
29 | + * <li>创建时间:2016年11月26日 | |
30 | + * <li>修改人: | |
31 | + * <li>修改时间: | |
32 | + */ | |
33 | + public static final String getHost(HttpServletRequest request) { | |
34 | + String ip = request.getHeader("X-Forwarded-For"); | |
35 | + if (StrUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { | |
36 | + ip = request.getHeader("Proxy-Client-IP"); | |
37 | + } | |
38 | + if (StrUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { | |
39 | + ip = request.getHeader("WL-Proxy-Client-IP"); | |
40 | + } | |
41 | + if (StrUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { | |
42 | + ip = request.getHeader("X-Real-IP"); | |
43 | + } | |
44 | + if (StrUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { | |
45 | + ip = request.getRemoteAddr(); | |
46 | + } | |
47 | + if ("127.0.0.1".equals(ip)) { | |
48 | + InetAddress inet = null; | |
49 | + try { // 根据网卡取本机配置的IP | |
50 | + inet = InetAddress.getLocalHost(); | |
51 | + } catch (UnknownHostException e) { | |
52 | + e.printStackTrace(); | |
53 | + } | |
54 | + ip = inet.getHostAddress(); | |
55 | + } | |
56 | + // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 | |
57 | + if (ip != null && ip.length() > 15) { | |
58 | + if (ip.indexOf(",") > 0) { | |
59 | + ip = ip.substring(0, ip.indexOf(",")); | |
60 | + } | |
61 | + } | |
62 | + return ip; | |
63 | + } | |
64 | + | |
65 | +} |
parent/hospital.mac/src/main/java/com/lyms/hospital/service/token/TokenService.java
View file @
21c3e12
... | ... | @@ -7,9 +7,9 @@ |
7 | 7 | { |
8 | 8 | |
9 | 9 | |
10 | - String createToken(Integer userId); | |
10 | + String createToken(String userId); | |
11 | 11 | |
12 | - String createToken(Integer userId, Integer second); | |
12 | + String createToken(String userId, Integer second); | |
13 | 13 | |
14 | 14 | boolean resetToken(String token); |
15 | 15 | |
16 | 16 | |
17 | 17 | |
... | ... | @@ -17,11 +17,11 @@ |
17 | 17 | |
18 | 18 | boolean validToken(String token, Integer second); |
19 | 19 | |
20 | - Integer getUserId(String token); | |
20 | + String getUserId(String token); | |
21 | 21 | |
22 | - void deleteAllToken(Integer userId); | |
22 | + void deleteAllToken(String userId); | |
23 | 23 | |
24 | - void deleteAllToken(Integer userId, String prefix); | |
24 | + void deleteAllToken(String userId, String prefix); | |
25 | 25 | |
26 | 26 | void deleteToken(String token); |
27 | 27 |
parent/hospital.mac/src/main/java/com/lyms/hospital/service/token/impl/TokenServiceImpl.java
View file @
21c3e12
... | ... | @@ -47,7 +47,7 @@ |
47 | 47 | } |
48 | 48 | |
49 | 49 | @Override |
50 | - public String createToken(Integer userId, Integer second) | |
50 | + public String createToken(String userId, Integer second) | |
51 | 51 | { |
52 | 52 | String token = getPrefix() + TokenUtils.getToken(UUID.randomUUID().toString()); |
53 | 53 | |
... | ... | @@ -75,7 +75,7 @@ |
75 | 75 | } |
76 | 76 | |
77 | 77 | @Override |
78 | - public String createToken(Integer userId) | |
78 | + public String createToken(String userId) | |
79 | 79 | { |
80 | 80 | return createToken(userId, seconds); |
81 | 81 | } |
82 | 82 | |
... | ... | @@ -111,13 +111,13 @@ |
111 | 111 | } |
112 | 112 | |
113 | 113 | @Override |
114 | - public Integer getUserId(String token) | |
114 | + public String getUserId(String token) | |
115 | 115 | { |
116 | 116 | Object obj = redisTemplate.opsForValue().get(token); |
117 | 117 | if (obj != null) |
118 | 118 | { |
119 | 119 | redisTemplate.opsForValue().set(token, SerializeUtils.serialize(obj), getSeconds()); |
120 | - return (Integer) obj; | |
120 | + return (String) obj; | |
121 | 121 | } |
122 | 122 | return null; |
123 | 123 | } |
... | ... | @@ -129,7 +129,7 @@ |
129 | 129 | } |
130 | 130 | |
131 | 131 | @Override |
132 | - public void deleteAllToken(Integer userId) | |
132 | + public void deleteAllToken(String userId) | |
133 | 133 | { |
134 | 134 | String tempKey = getPrefix() + "_tokenlist_" + userId; |
135 | 135 | Object obj = redisTemplate.opsForValue().get(tempKey); |
... | ... | @@ -142,7 +142,7 @@ |
142 | 142 | } |
143 | 143 | |
144 | 144 | @Override |
145 | - public void deleteAllToken(Integer userId, String prefix) | |
145 | + public void deleteAllToken(String userId, String prefix) | |
146 | 146 | { |
147 | 147 | String tempKey = prefix + "_tokenlist_" + userId; |
148 | 148 | Object obj = redisTemplate.opsForValue().get(tempKey); |
parent/hospital.web/src/main/java/com/lyms/hospital/inteceptor/TokenValidateInteceptor.java
View file @
21c3e12
1 | +package com.lyms.hospital.inteceptor; | |
2 | + | |
3 | + | |
4 | +import com.lyms.annotation.TokenRequired; | |
5 | +import com.lyms.constants.Constants; | |
6 | +import com.lyms.context.ContextHolder; | |
7 | +import com.lyms.exception.LoginException; | |
8 | +import com.lyms.hospital.session.SessionProvider; | |
9 | +import com.lyms.web.controller.BaseController; | |
10 | +import org.apache.commons.lang.StringUtils; | |
11 | +import org.springframework.beans.factory.annotation.Autowired; | |
12 | +import org.springframework.web.method.HandlerMethod; | |
13 | +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |
14 | + | |
15 | +import javax.security.auth.login.LoginContext; | |
16 | +import javax.servlet.http.HttpServletRequest; | |
17 | +import javax.servlet.http.HttpServletResponse; | |
18 | +import java.lang.annotation.Annotation; | |
19 | + | |
20 | +/** | |
21 | + * 验证token拦截器 | |
22 | + * <p> | |
23 | + * <ul> | |
24 | + * <li> | |
25 | + * 1、springmvc中配置TokenValidateInteceptor的拦截 | |
26 | + * 2、在需要拦截的方法上面配置TokenRequired注解 | |
27 | + * </li> | |
28 | + * </ul> | |
29 | + */ | |
30 | +public class TokenValidateInteceptor extends HandlerInterceptorAdapter | |
31 | +{ | |
32 | + | |
33 | + @Autowired | |
34 | + private SessionProvider sessionProvider; | |
35 | + | |
36 | + public static boolean isSiteController(Object handler) { | |
37 | + return handler instanceof HandlerMethod && (((HandlerMethod) handler).getBean() instanceof BaseController); | |
38 | + } | |
39 | + | |
40 | + @Override | |
41 | + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { | |
42 | + | |
43 | + if (!isSiteController(handler)) | |
44 | + return true; | |
45 | + TokenRequired clientRequired = findAnnotation((HandlerMethod) handler, TokenRequired.class); | |
46 | + if (null == clientRequired) | |
47 | + return true; | |
48 | + | |
49 | + return validateToken(request, response); | |
50 | + } | |
51 | + | |
52 | + private <T extends Annotation> T findAnnotation(HandlerMethod handler, Class<T> annotationType) { | |
53 | + T annotation = handler.getBeanType().getAnnotation(annotationType); | |
54 | + if (annotation != null) | |
55 | + return annotation; | |
56 | + return handler.getMethodAnnotation(annotationType); | |
57 | + } | |
58 | + | |
59 | + public boolean validateToken(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { | |
60 | + String token = httpServletRequest.getHeader(Constants.AUTH_HEADER); | |
61 | + if (StringUtils.isEmpty(token)) { | |
62 | + throw new LoginException("miss auth."); | |
63 | + } | |
64 | + LoginContext loginContext = sessionProvider.checkSession(httpServletRequest, httpServletResponse, token); | |
65 | + | |
66 | + return true; | |
67 | + } | |
68 | + | |
69 | + /** | |
70 | + * This implementation is empty. | |
71 | + */ | |
72 | + @Override | |
73 | + public void afterCompletion( | |
74 | + HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) | |
75 | + throws Exception { | |
76 | + ContextHolder.clean(); | |
77 | + } | |
78 | +} |
parent/hospital.web/src/main/java/com/lyms/hospital/session/ISessionProvider.java
View file @
21c3e12
1 | +package com.lyms.hospital.session; | |
2 | + | |
3 | +import javax.security.auth.login.LoginContext; | |
4 | +import javax.servlet.http.HttpServletRequest; | |
5 | +import javax.servlet.http.HttpServletResponse; | |
6 | + | |
7 | +/** | |
8 | + * | |
9 | + * 提供验证session的方法 | |
10 | + * | |
11 | + * Created by Administrator on 2016/6/2 0002. | |
12 | + */ | |
13 | +public interface ISessionProvider | |
14 | +{ | |
15 | + | |
16 | + /** | |
17 | + * 检查session | |
18 | + * | |
19 | + * @param request | |
20 | + * @param response | |
21 | + * @param token | |
22 | + * @return | |
23 | + */ | |
24 | + boolean checkSession(HttpServletRequest request, HttpServletResponse response, String token); | |
25 | + | |
26 | + /** | |
27 | + * 删除session | |
28 | + * @param token | |
29 | + */ | |
30 | + void removeSession(String token); | |
31 | + | |
32 | +} |
parent/hospital.web/src/main/java/com/lyms/hospital/session/SessionProvider.java
View file @
21c3e12
1 | +package com.lyms.hospital.session; | |
2 | + | |
3 | + | |
4 | +import javax.security.auth.login.LoginContext; | |
5 | +import javax.servlet.http.HttpServletRequest; | |
6 | +import javax.servlet.http.HttpServletResponse; | |
7 | +import java.util.Map; | |
8 | + | |
9 | +/** | |
10 | + * session 能力提供 | |
11 | + * <p> | |
12 | + * <p> | |
13 | + * Created by Administrator on 2016/6/2 0002. | |
14 | + */ | |
15 | +public class SessionProvider implements ISessionProvider { | |
16 | + /** | |
17 | + * 配置 | |
18 | + */ | |
19 | + private Map<String, ISessionProvider> iSessionProviderMap; | |
20 | + /** | |
21 | + * 默认的session提供 | |
22 | + */ | |
23 | + private ISessionProvider defaultSessionProvider; | |
24 | + /** | |
25 | + * 当前策略 | |
26 | + */ | |
27 | + private String currentStrateger; | |
28 | + | |
29 | + public String getCurrentStrateger() { | |
30 | + return currentStrateger; | |
31 | + } | |
32 | + | |
33 | + public void setCurrentStrateger(String currentStrateger) { | |
34 | + this.currentStrateger = currentStrateger; | |
35 | + } | |
36 | + | |
37 | + public ISessionProvider getDefaultSessionProvider() { | |
38 | + return defaultSessionProvider; | |
39 | + } | |
40 | + | |
41 | + public void setDefaultSessionProvider(ISessionProvider defaultSessionProvider) { | |
42 | + this.defaultSessionProvider = defaultSessionProvider; | |
43 | + } | |
44 | + | |
45 | + public Map<String, ISessionProvider> getiSessionProviderMap() { | |
46 | + return iSessionProviderMap; | |
47 | + } | |
48 | + | |
49 | + public void setiSessionProviderMap(Map<String, ISessionProvider> iSessionProviderMap) { | |
50 | + this.iSessionProviderMap = iSessionProviderMap; | |
51 | + } | |
52 | + | |
53 | + @Override | |
54 | + public LoginContext checkSession(HttpServletRequest request, HttpServletResponse response, String token) { | |
55 | + ISessionProvider iSessionProvider = iSessionProviderMap.get(currentStrateger); | |
56 | + if (null != iSessionProvider) { | |
57 | + return iSessionProvider.checkSession(request, response, token); | |
58 | + } | |
59 | + if (null != defaultSessionProvider) { | |
60 | + return defaultSessionProvider.checkSession(request, response, token); | |
61 | + } | |
62 | + return null; | |
63 | + } | |
64 | + | |
65 | + @Override | |
66 | + public void removeSession(String token) { | |
67 | + ISessionProvider iSessionProvider = iSessionProviderMap.get(currentStrateger); | |
68 | + if (null != iSessionProvider) { | |
69 | + iSessionProvider.removeSession(token); | |
70 | + } | |
71 | + if (null != defaultSessionProvider) { | |
72 | + defaultSessionProvider.removeSession(token); | |
73 | + } | |
74 | + } | |
75 | +} |
parent/hospital.web/src/main/java/com/lyms/hospital/session/strategy/LocalRedisSessionStrategy.java
View file @
21c3e12
1 | +package com.lyms.hospital.session.strategy; | |
2 | + | |
3 | +import com.lyms.base.common.entity.user.Users; | |
4 | +import com.lyms.base.common.service.user.UsersService; | |
5 | +import com.lyms.context.ContextHolder; | |
6 | +import com.lyms.context.PlatformContext; | |
7 | +import com.lyms.exception.LoginException; | |
8 | +import com.lyms.hospital.service.token.TokenService; | |
9 | +import com.lyms.hospital.session.ISessionProvider; | |
10 | +import com.lyms.util.IpUtils; | |
11 | +import org.apache.commons.lang.StringUtils; | |
12 | +import org.slf4j.Logger; | |
13 | +import org.slf4j.LoggerFactory; | |
14 | +import org.springframework.beans.factory.annotation.Autowired; | |
15 | +import org.springframework.stereotype.Component; | |
16 | + | |
17 | +import javax.servlet.http.HttpServletRequest; | |
18 | +import javax.servlet.http.HttpServletResponse; | |
19 | + | |
20 | +/** | |
21 | + * redis session 管理策越。 | |
22 | + * <p/> | |
23 | + * 详细描述 | |
24 | + * <p/> | |
25 | + * 示例代码 | |
26 | + * <pre> | |
27 | + * </pre/> | |
28 | + * | |
29 | + * @author JIAZHI.JIANG | |
30 | + * @version BME V100R001 2017-04-10 11:14 | |
31 | + * @since BME V100R001C40B104 | |
32 | + */ | |
33 | +@Component | |
34 | +public class LocalRedisSessionStrategy implements ISessionProvider | |
35 | +{ | |
36 | + | |
37 | + //日志调测器 | |
38 | + private static final Logger logger = LoggerFactory.getLogger(LocalRedisSessionStrategy.class); | |
39 | + | |
40 | + @Autowired | |
41 | + private TokenService tokenService; | |
42 | + @Autowired | |
43 | + private UsersService userService; | |
44 | + | |
45 | + @Override | |
46 | + public boolean checkSession(HttpServletRequest request, HttpServletResponse response, String token) | |
47 | + { | |
48 | + if (StringUtils.isEmpty(token)) | |
49 | + { | |
50 | + throw new LoginException(""); | |
51 | + } | |
52 | + String userId = tokenService.getUserId(token); | |
53 | + | |
54 | + if (StringUtils.isEmpty(userId)) | |
55 | + { | |
56 | + throw new LoginException(""); | |
57 | + } | |
58 | + | |
59 | + PlatformContext context = new PlatformContext(); | |
60 | + context.setToken(token); | |
61 | + context.setUserId(userId); | |
62 | + context.setIpAddr(IpUtils.getHost(request)); | |
63 | + | |
64 | + Users localUserService = userService.selectById(userId); | |
65 | + if (null == localUserService) | |
66 | + { | |
67 | + throw new LoginException(""); | |
68 | + } | |
69 | + context.setHospitalId(localUserService.getOrgId()); | |
70 | + ContextHolder.setContext(context); | |
71 | + return true; | |
72 | + } | |
73 | + | |
74 | + @Override | |
75 | + public void removeSession(String token) | |
76 | + { | |
77 | + tokenService.deleteToken(token); | |
78 | + } | |
79 | +} |