package org.hsweb.web.core.utils;
import org.hsweb.web.bean.po.user.User;
import org.hsweb.web.core.authorize.oauth2.OAuth2Manager;
import org.hsweb.web.core.authorize.oauth2.OAuth2ManagerHolder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Web常用工具集,用于获取当前登录用户,请求信息等
* Created by 浩 on 2015-08-25 0025.
*/
public class WebUtil {
/**
* 尝试获取当前请求的HttpServletRequest实例
*
* @return HttpServletRequest
*/
public static HttpServletRequest getHttpServletRequest() {
try {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
} catch (Exception e) {
return null;
}
}
/**
* 尝试获取当前登录的用户(基于ThreadLocal)
*
* @return 当前登录的用户
*/
public static User getLoginUser() {
return getLoginUser(getHttpServletRequest());
}
/**
* 在HttpSession中获取当前登录的用户
*
* @param session HttpSession
* @return 当前登录的用户
*/
public static User getLoginUser(HttpSession session) {
try {
return (User) session.getAttribute("user");
} catch (Exception e) {
}
return null;
}
public static User setCurrentUser(User user) {
ThreadLocalUtils.put("current-user", user);
return user;
}
public static void removeCurrentUser() {
ThreadLocalUtils.remove("current-user");
}
/**
* 在HttpServletRequest中获取当前登录的用户
*
* @param request HttpServletRequest
* @return 当前登录的用户
*/
public static User getLoginUser(HttpServletRequest request) {
if (request == null) return ThreadLocalUtils.get("current-user");
HttpSession session = request.getSession(false);
User user = null;
if (session != null) {
user = getLoginUser(session);
}
if (user == null) {
OAuth2Manager manager = OAuth2ManagerHolder.getManager();
if (manager != null) {
user = manager.getUserByRequest(request);
}
}
return user;
}
public static Map<String, String> getHeaders(HttpServletRequest request) {
Map<String, String> map = new LinkedHashMap<>();
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
/**
* 解析参数列表为map
*
* @param request request请求对象
* @return 参数集合
*/
public static Map<String, String> getParams(HttpServletRequest request) {
Map<String, String[]> map = request.getParameterMap();
Map<String, String> param = new LinkedHashMap<>();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] varr = entry.getValue();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < varr.length; i++) {
String var = varr[i];
if (i != 0) builder.append(",");
builder.append(var);
}
param.put(key, builder.toString());
}
return param;
}
/**
* 获取请求客户端的真实ip地址
*
* @param request 请求对象
* @return ip地址
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader(" x-forwarded-for ");
if (ip == null || ip.length() == 0 || " unknown ".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
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.getRemoteAddr();
}
return ip;
}
/**
* web应用绝对路径
*
* @param request 请求对象
* @return 绝对路径
*/
public static String getBasePath(HttpServletRequest request) {
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
return basePath;
}
}