自定義OAM錯誤頁面

wls1036發表於2021-10-15

背景

OAM在登入出錯時,會跳到OAM錯誤頁面,如圖

該頁面是OAM的標準錯誤頁面,非常的不友好,當使用者面對這麼一個頁面時,根本不知道如何操作。下面介紹如何自定義該頁面

實現

  • 下載oam-server.ear

登入OAM後臺,在目錄$MIDDLEWARE_HOME/Oracle_IAM1/oam/server/apps目錄下找到oam-server.ear,將其下載到本地

MIDDLEWARE_HOME是中介軟體目錄,比如/data/fmwhome/Oracle/Middleware/Oracle_IAM1/oam/server/apps
  • 修改頁面

用解壓軟體(如7-zip等)將oam-server.ear解壓到目錄下,如果沒有解壓軟體直接用jar命令也可以解壓

jar -xvf oam-server.ear

解壓後,會有一個ngsso-web.war檔案,以同樣的方法將該檔案解壓出來,在路徑ngsso-web/pages目錄下,該目錄包含了OAM所有標準的頁面,以jsp方式提供,其中頁面defaultservererror.jsp就是那個錯誤頁面,所以只需修改該頁面即可。頁面原始碼如下

<%@ page language="java" contentType="text/html" %>
<%@ page isErrorPage="true" import="java.io.*,oracle.security.am.engines.sso.ServerMsg" %>
<%@page import="oracle.security.am.common.utilities.constant.GenericConstants" %>
<%@page import="java.util.*, java.text.MessageFormat, oracle.security.am.engines.sso.ServerMsg"%>
<%@page import="oracle.security.am.common.utilities.css.XSSUtil" %>

<%@ include file="locale-ctx.jsp" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%!
public void jspInit(){
    oracle.security.am.pbl.transport.http.proxy.ServletCatalog.registerServlet("/pages/defaultservererror.jsp", this);
}
%>
<%
// if proxy loading, return immediately
if ("true".equals(request.getParameter("proxyloading")))
    return;
    
  //Set the Expires and Cache Control Headers
  response.setHeader("Cache-Control", "no-cache, no-store");
  response.setHeader("Pragma", "no-cache");
  response.setHeader("Expires", "0");
  //Added for Combating ClickJacking
  XSSUtil.addHeader(response, "");
  response.setContentType("text/html; charset=UTF-8");
 
  final String appName = request.getContextPath();
  //initializing the messageBundle first
  java.util.Locale myLocale = request.getLocale();
  String defaultResourceBundle = "oracle.security.am.engines.sso.ServerMsg";
  ResourceBundle msgBundle  = ResourceBundle.getBundle(defaultResourceBundle, myLocale);

  final String defaultErrorCode = "OAM-7";
  String simpleMessage = msgBundle.getString(defaultErrorCode);
  // if redirection due to error happened
  Object errCode = request.getAttribute(GenericConstants.ERROR_CODE);

  if(errCode != null) {
    try {
      simpleMessage = msgBundle.getString(errCode.toString());
    } 
    catch(Exception e) {
      //ignore. simpleMessage will be set to the default
    }
  }
    
%>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=language%>" lang="<%=language%>"  dir="<%=textDirection%>">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title><%=msgBundle.getString("SSO")%></title>
    <link rel='stylesheet' href='<%=request.getContextPath()%>/pages/css/login_page<%=cssPrefix%>.css'/>
   <!--...省略部分程式碼-->
    </div>
</body>
</html>

可以將html部分程式碼修改如下

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="refresh" content="0; URL=重定向的地址" />
</head>
</html>

將該頁面重定向到指定頁面,之所以建議重定向而不是直接在jsp上進行修改是因為如果把頁面寫在jsp中,那麼每次更新都需要重新部署oam-server,如果是重定向到自定義頁面就比較靈活。

  • 重新打包

只需將修改後的defaultservererror.jsp檔案覆蓋ear中的jsp檔案即可,可以直接用7-zip軟體開啟oam-server.ear/ngsso-web.war/pages/,然後直接將新的jsp檔案拖入直接覆蓋儲存即可,如果沒有7-zip可以用以下命令重新打包

jar -uvf ngsso-web.war pages/defaultservererror.jsp
jar -uvf oam-server.ear ngsso-web.war
  • 部署

將oam-server.ear上傳到伺服器,覆蓋原ear檔案即可(!!!!一定要先備份原來的),另外需要刪除所有oamserver下的tmp資料夾,位於$DOMAIN_HOME/servers/oam_server1\tmp

  • 重啟

重啟所有oam manager server

相關文章