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.
191 lines
7.1 KiB
191 lines
7.1 KiB
package com.fr.plugin; |
|
|
|
|
|
import com.fanruan.api.decision.store.StateHubManager; |
|
import com.fanruan.api.net.http.HttpKit; |
|
import com.fr.base.TemplateUtils; |
|
import com.fr.data.NetworkHelper; |
|
import com.fr.decision.authority.data.User; |
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
|
import com.fr.decision.webservice.utils.DecisionStatusService; |
|
import com.fr.decision.webservice.v10.login.LoginService; |
|
import com.fr.decision.webservice.v10.user.UserService; |
|
import com.fr.json.JSONObject; |
|
import com.fr.log.FineLoggerFactory; |
|
import com.fr.plugin.transform.FunctionRecorder; |
|
import com.fr.stable.StringUtils; |
|
import com.fr.store.StateHubService; |
|
import com.fr.web.utils.WebUtils; |
|
|
|
import javax.servlet.FilterChain; |
|
import javax.servlet.FilterConfig; |
|
import javax.servlet.ServletException; |
|
import javax.servlet.http.Cookie; |
|
import javax.servlet.http.HttpServletRequest; |
|
import javax.servlet.http.HttpServletResponse; |
|
import javax.servlet.http.HttpSession; |
|
import java.io.IOException; |
|
import java.io.PrintWriter; |
|
import java.io.StringWriter; |
|
import java.net.URLEncoder; |
|
import java.nio.charset.StandardCharsets; |
|
import java.util.Enumeration; |
|
import java.util.HashMap; |
|
import java.util.Iterator; |
|
import java.util.Map; |
|
|
|
@FunctionRecorder(localeKey = "zkkd") |
|
public class PLFilter extends AbstractGlobalRequestFilterProvider { |
|
@Override |
|
public String filterName() { |
|
return "alfidfdkter"; |
|
} |
|
|
|
|
|
@Override |
|
public String[] urlPatterns() { |
|
return new String[]{ |
|
"/*" |
|
}; |
|
} |
|
|
|
@Override |
|
public void init(FilterConfig filterConfig) { |
|
ZtgtConfig.getInstance(); |
|
FineLoggerFactory.getLogger().error("拦截器启动"); |
|
super.init(filterConfig); |
|
} |
|
|
|
private boolean isLogOut(HttpServletRequest req) { |
|
String url = WebUtils.getOriginalURL(req); |
|
String servletNamePrefix = "/decision/logout"; |
|
return url.contains(servletNamePrefix) && req.getMethod().equals("POST"); |
|
} |
|
|
|
private void delLoginOut(HttpServletRequest req, HttpServletResponse res) { |
|
try { |
|
//执行帆软内部的退出 |
|
User users = UserService.getInstance().getUserByRequestCookie(req); |
|
|
|
LoginService.getInstance().logout(req, res); |
|
if (users != null) { |
|
FineLoggerFactory.getLogger().error("{} 登出成功 ", users.getUserName()); |
|
} |
|
JSONObject jsonObject = new JSONObject(); |
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
|
String url = plConfig.getLogoutUrl(); |
|
jsonObject.put("data", url); |
|
//调用外部接口注销accessToken |
|
//指定退出之后到他们登录页面 |
|
com.fr.web.utils.WebUtils.printAsJSON(res, jsonObject); |
|
} catch (Exception var4) { |
|
} |
|
} |
|
|
|
private boolean needFilter(HttpServletRequest request) { |
|
String requestURI = request.getRequestURI(); |
|
String isAdmin = request.getParameter("isAdmin"); |
|
if (StringUtils.equals(isAdmin, "1")) { |
|
return false; |
|
} |
|
if (StringUtils.isNotBlank(requestURI) && request.getMethod().equals("GET")) { |
|
if (requestURI.endsWith("decision")) { |
|
return true; |
|
} |
|
if (requestURI.endsWith("/view/form") || requestURI.endsWith("/view/report")) { |
|
if (StringUtils.isNotBlank(request.getParameter("viewlet"))) { |
|
return true; |
|
} |
|
} |
|
if (requestURI.contains("/v10/entry/access/") && request.getMethod().equals("GET")) { |
|
return true; |
|
} |
|
if (requestURI.contains("/v5/design/report") && (requestURI.endsWith("/edit") || requestURI.endsWith("/view"))) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
public String getOriginalUrlIgnoreCode(HttpServletRequest request) throws Exception { |
|
StringBuffer url = new StringBuffer(request.getRequestURI()); |
|
Map parameterMap = request.getParameterMap(); |
|
Iterator iterator = parameterMap.entrySet().iterator(); |
|
boolean notFirst = url.toString().indexOf("?") == -1; |
|
while (iterator.hasNext()) { |
|
Map.Entry entry = (Map.Entry) iterator.next(); |
|
if (StringUtils.equals("code", entry.getKey().toString())) { |
|
continue; |
|
} |
|
if (notFirst) { |
|
url.append('?'); |
|
notFirst = false; |
|
} else { |
|
url.append('&'); |
|
} |
|
|
|
url.append(entry.getKey().toString()); |
|
url.append('='); |
|
url.append( URLEncoder.encode(request.getParameter(entry.getKey().toString()),"utf-8")); |
|
} |
|
FineLoggerFactory.getLogger().info("重定向到:" + url.toString()); |
|
return url.toString(); |
|
} |
|
@Override |
|
public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) { |
|
try { |
|
if (isLogOut(request)) { |
|
delLoginOut(request, httpServletResponse); |
|
return; |
|
} |
|
if (needFilter(request) && !isLogin(request)) { |
|
//跳转到登录界面 |
|
setCookie(httpServletResponse, "loginCallBack", getOriginalUrlIgnoreCode(request)); |
|
sendRedirect(httpServletResponse, getCodeUrl(request)); |
|
return; |
|
} |
|
filterChain.doFilter(request, httpServletResponse); |
|
} catch (IOException e) { |
|
printException2FrLog(e); |
|
} catch (ServletException e) { |
|
printException2FrLog(e); |
|
} catch (Exception e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
|
|
private static void setCookie(HttpServletResponse response, String name, String value) { |
|
Cookie cookie = new Cookie(name, value); |
|
cookie.setPath("/"); |
|
response.addCookie(cookie); |
|
} |
|
private void sendRedirect(HttpServletResponse res, String url) throws IOException { |
|
Map<String, String> params = new HashMap<>(); |
|
params.put("callBack", url); |
|
WebUtils.writeOutTemplate("com/fr/plugin/redirect.html", res, params); |
|
} |
|
|
|
private String getCodeUrl(HttpServletRequest req) throws Exception { |
|
String originalURL = URLEncoder.encode(getOriginalUrlIgnoreCode(req), StandardCharsets.UTF_8.name()); |
|
ZtgtConfig plConfig = ZtgtConfig.getInstance(); |
|
String baseUrl = plConfig.getValAddr(); |
|
String clientId = plConfig.getAppId(); |
|
String redirect_uri = URLEncoder.encode(plConfig.getFrUrl()+"/url/loginCallback", "UTF-8"); |
|
return baseUrl + "/authorize?response_type=code&client_id=" + clientId + "&state=xplatform&redirect_uri=" + redirect_uri + "&oauth_timestamp=" + System.currentTimeMillis() + "&target_uri=" + originalURL; |
|
} |
|
|
|
|
|
public static void printException2FrLog(Throwable e) { |
|
StringWriter writer = new StringWriter(); |
|
e.printStackTrace(new PrintWriter(writer)); |
|
String s = writer.toString(); |
|
FineLoggerFactory.getLogger().error("错误:{}", s); |
|
} |
|
|
|
private boolean isLogin(HttpServletRequest req) { |
|
return LoginService.getInstance().isLogged(req); |
|
} |
|
|
|
|
|
} |
|
|
|
|