You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
5.0 KiB
144 lines
5.0 KiB
3 years ago
|
package com.fr.plugin.oauth;
|
||
|
|
||
|
import com.fr.data.NetworkHelper;
|
||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
|
||
|
import com.fr.decision.mobile.terminal.TerminalHandler;
|
||
|
import com.fr.decision.webservice.bean.authentication.LoginClientBean;
|
||
|
import com.fr.decision.webservice.v10.login.LoginService;
|
||
|
import com.fr.decision.webservice.v10.login.TokenResource;
|
||
|
import com.fr.log.FineLoggerFactory;
|
||
|
import com.fr.plugin.oauth.utils.HtmlUtils;
|
||
|
import com.fr.plugin.oauth.utils.RedirectUtils;
|
||
|
import com.fr.plugin.transform.ExecuteFunctionRecord;
|
||
|
import com.fr.plugin.transform.FunctionRecorder;
|
||
|
import com.fr.stable.StringUtils;
|
||
|
|
||
|
import javax.servlet.FilterChain;
|
||
|
import javax.servlet.FilterConfig;
|
||
|
import javax.servlet.http.HttpServletRequest;
|
||
|
import javax.servlet.http.HttpServletResponse;
|
||
|
import java.io.UnsupportedEncodingException;
|
||
|
import java.net.URLDecoder;
|
||
|
import java.net.URLEncoder;
|
||
|
|
||
|
@FunctionRecorder
|
||
|
public class LoginFilter extends AbstractGlobalRequestFilterProvider {
|
||
|
|
||
|
private static final String REDIRECT_URI = "/plugin/public/com.fr.plugin.JSD10117/authLogin";
|
||
|
|
||
|
@Override
|
||
|
public void init(FilterConfig filterConfig) {
|
||
|
W2Config.getInstance();
|
||
|
super.init(filterConfig);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String filterName() {
|
||
|
return "loginFilter";
|
||
|
}
|
||
|
|
||
|
@ExecuteFunctionRecord
|
||
|
@Override
|
||
|
public String[] urlPatterns() {
|
||
|
return new String[]{
|
||
|
/*"/decision/login",
|
||
|
"/login.html"*/
|
||
|
"/*"
|
||
|
};
|
||
|
}
|
||
|
|
||
|
|
||
|
@Override
|
||
|
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) {
|
||
|
try {
|
||
|
boolean isLoginReq = isLoginReqest(req);
|
||
|
// 约定:放在iframe中的链接带参数iniframe=true
|
||
|
boolean iniframe = Boolean.parseBoolean(req.getParameter("iniframe"));
|
||
|
|
||
|
boolean sharetoken = Boolean.parseBoolean(req.getParameter("sharetoken"));
|
||
|
|
||
|
if (isLoginReq || iniframe || sharetoken) {
|
||
|
LoginClientBean bean = isLogined(req);
|
||
|
if (bean == null) {
|
||
|
boolean redirect = req.getMethod().equals("GET");
|
||
|
if (redirect) {
|
||
|
gotoAuthorize(req, res, iniframe, sharetoken);
|
||
|
return;
|
||
|
}
|
||
|
} else {
|
||
|
// 登录成功,跳转至目标页面
|
||
|
RedirectUtils.redirect(bean.getUsername(), W2Config.getInstance(), bean.getToken(), res);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
filterChain.doFilter(req, res);
|
||
|
|
||
|
} catch (Exception e) {
|
||
|
FineLoggerFactory.getLogger().error(e.getMessage());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 跳转到统一登录页面
|
||
|
*/
|
||
|
public static void gotoAuthorize(HttpServletRequest req, HttpServletResponse res, boolean inIframe, boolean sharetoken) throws UnsupportedEncodingException {
|
||
|
W2Config w2Config = W2Config.getInstance();
|
||
|
String callBack = URLEncoder.encode(w2Config.getFrurl() + REDIRECT_URI, "UTF-8");
|
||
|
if (inIframe) {
|
||
|
callBack = URLEncoder.encode(w2Config.getFrurl() + REDIRECT_URI + "?iframeurl=" + getUrl(req), "UTF-8");
|
||
|
} else if (sharetoken) {
|
||
|
callBack = URLEncoder.encode(w2Config.getFrurl() + REDIRECT_URI + "?redirecturl=" + getUrl(req), "UTF-8");
|
||
|
}
|
||
|
|
||
|
callBack = callBack.replace("sharetoken", "nosharetoken");
|
||
|
callBack = callBack.replace("iniframe", "noiniframe");
|
||
|
|
||
|
String url = "";
|
||
|
if (sharetoken) {
|
||
|
url = callBack;
|
||
|
} else {
|
||
|
url = w2Config.getIdf() + callBack;
|
||
|
}
|
||
|
HtmlUtils.sendRedirect("", url, res);
|
||
|
}
|
||
|
|
||
|
private LoginClientBean isLogined(HttpServletRequest req) {
|
||
|
LoginClientBean bean = null;
|
||
|
try {
|
||
|
String token = TokenResource.COOKIE.getToken(req);
|
||
|
bean = LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, NetworkHelper.getDevice(req)));
|
||
|
} catch (Exception e) {
|
||
|
bean = null;
|
||
|
FineLoggerFactory.getLogger().error(e.getMessage());
|
||
|
}
|
||
|
return bean;
|
||
|
}
|
||
|
|
||
|
private boolean isLoginReqest(HttpServletRequest req) {
|
||
|
String url = req.getRequestURL().toString();
|
||
|
if (StringUtils.isNotBlank(url)) {
|
||
|
if (url.endsWith("/decision/login") || url.endsWith("/login.html")) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
private static String getUrl(HttpServletRequest request) {
|
||
|
String url = request.getRequestURL().toString();
|
||
|
String param = request.getQueryString();
|
||
|
if (StringUtils.isNotBlank(param)) {
|
||
|
try {
|
||
|
if (request.getCharacterEncoding() != null) {
|
||
|
param = URLDecoder.decode(param, request.getCharacterEncoding());
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
FineLoggerFactory.getLogger().error(e.getMessage());
|
||
|
}
|
||
|
url = url + "?" + param;
|
||
|
}
|
||
|
return url;
|
||
|
}
|
||
|
|
||
|
}
|