13 changed files with 156 additions and 169 deletions
@ -0,0 +1,11 @@ |
|||
package com.elink.esua.common.token.error; |
|||
|
|||
/** |
|||
* @author rongchao |
|||
* @Date 18-11-20 |
|||
*/ |
|||
public interface IErrorCode { |
|||
int getCode(); |
|||
|
|||
String getMsg(); |
|||
} |
@ -0,0 +1,66 @@ |
|||
package com.elink.esua.epdc.commons.tools.utils; |
|||
|
|||
import org.springframework.web.context.request.RequestAttributes; |
|||
import org.springframework.web.context.request.RequestContextHolder; |
|||
import org.springframework.web.context.request.ServletRequestAttributes; |
|||
|
|||
import javax.servlet.http.HttpServletRequest; |
|||
|
|||
/** |
|||
* Web工具类 |
|||
* |
|||
* @author rongchao |
|||
* @Date 18-11-20 |
|||
*/ |
|||
public class WebUtil { |
|||
|
|||
public static HttpServletRequest getHttpServletRequest() { |
|||
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
|||
HttpServletRequest request = requestAttributes.getRequest(); |
|||
return request; |
|||
} |
|||
|
|||
public static Object getAttributesFromRequest(String paramName) { |
|||
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
|||
return requestAttributes.getAttribute(paramName, RequestAttributes.SCOPE_REQUEST); |
|||
} |
|||
|
|||
public static void setAttributesFromRequest(String paramName, Object obj) { |
|||
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
|||
requestAttributes.setAttribute(paramName, obj, RequestAttributes.SCOPE_REQUEST); |
|||
} |
|||
|
|||
/** |
|||
* 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址, |
|||
* <p> |
|||
* 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢? |
|||
* 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 |
|||
* <p> |
|||
* 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, |
|||
* 192.168.1.100 |
|||
* <p> |
|||
* 用户真实IP为: 192.168.1.110 |
|||
* |
|||
* @return |
|||
*/ |
|||
public static String getIpAddress() { |
|||
HttpServletRequest request = getHttpServletRequest(); |
|||
String ip = request.getHeader("x-forwarded-for"); |
|||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
|||
ip = request.getHeader("Proxy-Client-IP"); |
|||
} |
|||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
|||
ip = request.getHeader("WL-Proxy-Client-IP"); |
|||
} |
|||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
|||
ip = request.getHeader("HTTP_CLIENT_IP"); |
|||
} |
|||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
|||
ip = request.getHeader("HTTP_X_FORWARDED_FOR"); |
|||
} |
|||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
|||
ip = request.getRemoteAddr(); |
|||
} |
|||
return ip; |
|||
} |
|||
} |
@ -1,21 +0,0 @@ |
|||
/** |
|||
* Copyright (c) 2018 人人开源 All rights reserved. |
|||
* |
|||
* https://www.renren.io
|
|||
* |
|||
* 版权所有,侵权必究! |
|||
*/ |
|||
|
|||
package com.elink.esua.epdc.annotation; |
|||
|
|||
import java.lang.annotation.*; |
|||
|
|||
/** |
|||
* 登录效验 |
|||
* @author Mark sunlightcs@gmail.com |
|||
*/ |
|||
@Target(ElementType.METHOD) |
|||
@Retention(RetentionPolicy.RUNTIME) |
|||
@Documented |
|||
public @interface Login { |
|||
} |
@ -1,25 +0,0 @@ |
|||
/** |
|||
* Copyright (c) 2018 人人开源 All rights reserved. |
|||
* |
|||
* https://www.renren.io
|
|||
* |
|||
* 版权所有,侵权必究! |
|||
*/ |
|||
|
|||
package com.elink.esua.epdc.annotation; |
|||
|
|||
import java.lang.annotation.ElementType; |
|||
import java.lang.annotation.Retention; |
|||
import java.lang.annotation.RetentionPolicy; |
|||
import java.lang.annotation.Target; |
|||
|
|||
/** |
|||
* 登录用户信息 |
|||
* |
|||
* @author Mark sunlightcs@gmail.com |
|||
*/ |
|||
@Target(ElementType.PARAMETER) |
|||
@Retention(RetentionPolicy.RUNTIME) |
|||
public @interface LoginUser { |
|||
|
|||
} |
@ -1,75 +0,0 @@ |
|||
/** |
|||
* Copyright (c) 2018 人人开源 All rights reserved. |
|||
* |
|||
* https://www.renren.io
|
|||
* |
|||
* 版权所有,侵权必究! |
|||
*/ |
|||
|
|||
package com.elink.esua.epdc.interceptor; |
|||
|
|||
import com.elink.esua.epdc.annotation.Login; |
|||
import com.elink.esua.epdc.exception.ModuleErrorCode; |
|||
import com.elink.esua.epdc.annotation.Login; |
|||
import com.elink.esua.epdc.commons.tools.exception.RenException; |
|||
import com.elink.esua.epdc.entity.TokenEntity; |
|||
import com.elink.esua.epdc.exception.ModuleErrorCode; |
|||
import com.elink.esua.epdc.service.TokenService; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Component; |
|||
import org.springframework.web.method.HandlerMethod; |
|||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; |
|||
|
|||
import javax.servlet.http.HttpServletRequest; |
|||
import javax.servlet.http.HttpServletResponse; |
|||
|
|||
/** |
|||
* 权限(Token)验证 |
|||
* |
|||
* @author Mark sunlightcs@gmail.com |
|||
*/ |
|||
@Component |
|||
public class AuthorizationInterceptor extends HandlerInterceptorAdapter { |
|||
@Autowired |
|||
private TokenService tokenService; |
|||
|
|||
public static final String USER_KEY = "userId"; |
|||
|
|||
@Override |
|||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { |
|||
Login annotation; |
|||
if(handler instanceof HandlerMethod) { |
|||
annotation = ((HandlerMethod) handler).getMethodAnnotation(Login.class); |
|||
}else{ |
|||
return true; |
|||
} |
|||
|
|||
if(annotation == null){ |
|||
return true; |
|||
} |
|||
|
|||
//从header中获取token
|
|||
String token = request.getHeader("token"); |
|||
//如果header中不存在token,则从参数中获取token
|
|||
if(StringUtils.isBlank(token)){ |
|||
token = request.getParameter("token"); |
|||
} |
|||
|
|||
//token为空
|
|||
if(StringUtils.isBlank(token)){ |
|||
throw new RenException(ModuleErrorCode.TOKEN_NOT_EMPTY); |
|||
} |
|||
|
|||
//查询token信息
|
|||
TokenEntity tokenEntity = tokenService.getByToken(token); |
|||
if(tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()){ |
|||
throw new RenException(ModuleErrorCode.TOKEN_INVALID); |
|||
} |
|||
|
|||
//设置userId到request里,后续根据userId,获取用户信息
|
|||
request.setAttribute(USER_KEY, tokenEntity.getUserId()); |
|||
|
|||
return true; |
|||
} |
|||
} |
Loading…
Reference in new issue