    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import static org.opengion.fukurou.util.StringUtil.nval;
    019
    020import java.io.IOException;
    021import java.io.ObjectInputStream;
    022import java.io.ObjectOutputStream;
    023
    024import javax.mail.internet.MimeUtility;
    025import javax.servlet.ServletException;
    026import javax.servlet.http.HttpServletRequest;
    027import javax.servlet.http.HttpServletResponse;
    028
    029import org.opengion.fukurou.security.HybsCryptography;
    030import org.opengion.fukurou.util.LogWriter;
    031import org.opengion.fukurou.util.StringUtil;
    032import org.opengion.fukurou.util.XHTMLTag;
    033import org.opengion.hayabusa.common.HybsSystem;
    034import org.opengion.hayabusa.common.HybsSystemException;
    035import org.opengion.hayabusa.db.DBTableModel;
    036import org.opengion.hayabusa.resource.GUIInfo;
    037
    038/**
    039 * 制御を別の画面にフォワードする場合に使用するタグです(通常は、entry.jsp で使用します)。
    040 *
    041 * フォワード時に、指定の引数をセットできます。
    042 *
    043 * @og.formSample
    044 * ●形式：&lt;og:forward page="…" gamenId="[…]" /&gt;
    045 * ●body：なし
    046 *
    047 * ●Tag定義：
    048 *   &lt;og:forward
    049 *       gamenId            【TAG】gamenId 属性を登録します
    050 *       page             ○【TAG】転送先URLを指定します(必須)。
    051 *       keys               【TAG】キーを CSV 形式でセットします
    052 *       vals               【TAG】キーに対応する値を CSV 形式でセットします
    053 *       dbkeys             【TAG】DBキーをCSV 形式でセットします
    054 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
    055 *       useRedirect        【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false)
    056 *       target             【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します
    057 *       filename           【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null)
    058 *       noTransition       【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します
    059 *       useAjaxSubmit      【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうかを指定します
    060 *       redirectEncode     【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null)
    061 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    062 *   /&gt;
    063 *
    064 * ●使用例
    065 *       &lt;og:forward
    066 *          page          = "転送先URLを指定します(必須)。"
    067 *          dbkeys        = "DBキーをCSV 形式でセットします。"
    068 *          keys          = "キーを CSV 形式でセットします。"
    069 *          vals          = "キーに対応する値を CSV 形式でセットします。"
    070 *          scope         = "キャッシュする場合のスコープ(request,page,session,applicaton)を指定します(初期値:session)。"
    071 *          gamenId       = "gamenId 属性を登録します。"
    072 *          useRedirect   = "useRedirect 属性を登録します。"
    073 *          filename      = "ファイル転送時にファイル名を指定する場合に設定します。"
    074 *          target        = "taregt 属性を登録します。"
    075 *          noTransition  = "実際にforwardせずに、id="forwardUrl"属性のbody部分に遷移先のURLを出力します。(画面遷移なしモード時に使用します)"
    076 *       /&gt;
    077 *
    078 * @og.group 画面制御
    079 *
    080 * @version  4.0
    081 * @author       Kazuhiko Hasegawa
    082 * @since    JDK5.0,
    083 */
    084public class ForwardTag extends CommonTagSupport {
    085        //* このプログラムのVERSION文字列を設定します。   {@value} */
    086        private static final String VERSION = "5.7.4.1 (2014/03/14)" ;
    087
    088        private static final long serialVersionUID = 574120140314L ;
    089
    090        private transient DBTableModel  table   = null;
    091        private String          tableId         = HybsSystem.TBL_MDL_KEY;
    092        private String          page            = null;
    093        private String          keys            = null;
    094        private String          dbkeys          = null;
    095        private String[]        vals            = null;
    096        private String          gamenId         = null;         // 3.5.4.9 (2004/02/25) 追加
    097        private boolean         useRedirect = false;    // 3.5.6.6 (2004/08/23) 追加
    098        private String          target          = null;         // 3.8.0.4 (2005/08/08) 追加
    099        private String          filename        = null;         // 4.0.0 (2005/11/30) 追加
    100//      private static final String             disposition = "inline"; // 固定
    101        private String          disposition = "inline"; // 5.10.12.0 (2019/06/03)
    102        private boolean         noTransition= false;    // 4.3.3.0 (2008/10/01) 追加
    103        private boolean         useAjaxSubmit           = false;        // 4.3.8.0 (2009/08/01) 追加
    104//      private boolean         useEncodeRedirect       = true;         // 5.6.5.0 (2013/06/07) 追加、即廃止
    105        private String          redirectEncode  = null;                 // 5.6.5.0 (2013/06/07) 追加
    106        // urlCheck関係 5.10.11.0 (2019/05/03) 追加
    107        private boolean useURLCheck = HybsSystem.sysBool( "LINK_URL_CHECK" );
    108        private long            urlCheckTime= 1000*60*60*24;// 5.10.11.0 (2019/05/03)
    109        private String          urlCheckCrypt = HybsSystem.sys( "URL_CHECK_CRYPT" );
    110
    111        /**
    112         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    113         *
    114         * @og.rev 2.1.0.0 (2002/10/11) 戻り値の先頭の "?" を追加しないように変更。
    115         * @og.rev 3.0.1.3 (2003/03/11) 直接転送した場合の整合性を取る為の対応。
    116         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    117         * @og.rev 3.1.2.0 (2003/04/07) ソースコード中の固定値を、定義ファイルを使用するように変更する。
    118         * @og.rev 3.5.4.9 (2004/02/25) gamenId を指定して、フォワードできるようにします。
    119         * @og.rev 3.5.6.6 (2004/08/23) useRedirect 属性を追加します。
    120         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
    121         * @og.rev 4.3.7.1 (2009/06/08) target属性に絶対パス及び"_"で始まる予約語を指定できるようにします。
    122         * @og.rev 4.3.8.0 (2009/08/01) useAjaxSubmit対応、noTransition値取得メソッド名変更
    123         * @og.rev 5.0.0.4 (2009/10/01) 画面遷移なし登録で戻った際に最終行が選択されるバグを修正
    124         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
    125         * @og.rev 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う)
    126         * @og.rev 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。
    127         * @og.rev 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。
    128         * @og.rev 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正
    129         * @og.rev 5.3.8.0 (2011/08/01) ファイル名指定でIEの場合、URLエンコードすると途中で切れるため(IE7のバグ)、Shift_JIS(WIndows-31J)で直接指定する。
    130         * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。
    131         * @og.rev 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連)
    132         * @og.rev 5.9.29.0 (2018/01/30) Edge,safariの日本語ファイル名対応(RFC6266方式を併記）
    133         * @og.rev 5.10.11.0 (2019/05/03) URLチェック対応を追加
    134         * @og.rev 5.10.12.0 (2019/06/03) content-typeを追加
    135         *
    136         * @return      後続処理の指示
    137         */
    138        @Override
    139        public int doEndTag() {
    140                debugPrint();           // 4.0.0 (2005/02/28)
    141                // noTransition = isNoTransitionRequest() || noTransition; // 4.3.3.0 (2008/10/01) 追加
    142//              noTransition = isNoTransitionSession() || noTransition; // 4.3.8.0 (2009/08/01) メソッド名変更
    143//              useAjaxSubmit    = isAjaxSubmitSession() || useAjaxSubmit; // 4.3.8.0 (2009/08/01) 追加
    144                noTransition = isNoTransitionRequest(); // 5.1.3.0 (2010/02/01)
    145                useAjaxSubmit = isAjaxSubmitRequest(); // 5.1.3.0 (2010/02/01)
    146
    147                String urlEnc = getUrlEncode();
    148                String fwdUrl = makeGamenLink();                // 3.5.4.9 (2004/02/25)
    149
    150                HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
    151                try {
    152                        String url = response.encodeRedirectURL( fwdUrl );      // 3.5.4.9 (2004/02/25)
    153
    154                        if( filename != null ) {
    155                                // 5.1.6.0 (2010/05/01) IE以外は、MIMEエンコードする。(RFC2231に従う)
    156//                              if( ( (HttpServletRequest)pageContext.getRequest() ).getHeader( "User-Agent" ).indexOf( "MSIE" ) == -1 ) {
    157//                                      filename = MimeUtility.encodeWord( filename, "UTF-8", "B" );
    158//                              }
    159//                              else {
    160//                                      // 5.3.8.0 (2011/08/01) IEの場合、URLエンコードすると途中で切れるため(IE7のバグ)、Shift_JIS(WIndows-31J)で直接指定する。
    161////                                    filename = StringUtil.urlEncode( filename );
    162//                                      filename = new String( filename.getBytes("Windows-31J"), "ISO-8859-1" );
    163//                              }
    164                                String newFilename        = filename;
    165                                String newFilenameEnc = StringUtil.urlEncode( newFilename );  // 5.9.29.0 (2018/02/02)
    166
    167                                // 5.7.4.1 (2014/03/14) 日本語ファイル名が正しく処理できない件を修正(IE11のMSIE関連)
    168                                // 条件を反転させた上でIE11対応を行う
    169                                String reqHeader = ((HttpServletRequest)pageContext.getRequest()).getHeader( "User-Agent" );
    170                                if( reqHeader.indexOf( "MSIE" ) >= 0 || reqHeader.indexOf( "Trident" ) >= 0 ) {
    171                                        filename = new String( filename.getBytes("Windows-31J"), "ISO-8859-1" );
    172                                }
    173                                else {
    174                                        filename = MimeUtility.encodeWord( filename, "UTF-8", "B" );
    175                                }
    176
    177                                (response).setContentType( "application/octet-stream" ); // 5.10.12.0 (2019/06/3)
    178
    179//                              (response).setHeader( "Content-Disposition",disposition + "; filename=\"" + filename + "\"" );
    180                                (response).setHeader( "Content-disposition",disposition + "; filename=\"" + newFilename + "\"; "
    181                                                + "filename*=UTF-8''" + newFilenameEnc ); // 5.9.29.0 (2018/02/02)　RFC6266方式を併記
    182                        }
    183                        // 5.1.7.0 (2010/06/01) 画面IDをパラメーターに付加する。
    184                        // 5.1.8.0 (2010/07/01) httpが指定されていた場合に、自身の画面IDが付加されるバグを修正
    185                        else {
    186//                              if( page.endsWith( ".jsp" ) ) {
    187                                if( !page.startsWith( "http" ) && page.endsWith( ".jsp" ) ) {
    188                                        if( keys == null || keys.length() == 0 || ( "," + keys + "," ).indexOf( ",GAMENID," ) < 0 ) {
    189                                                if( gamenId != null && gamenId.length() > 0 ) {
    190                                                        url = XHTMLTag.addUrlEncode( url, "GAMENID=" + gamenId );
    191                                                }
    192                                                // useRedirect=trueでGAMENIDを指定せず、../GF9100/index.jsp等と書かれている場合の対応
    193                                                else if( !useRedirect ) {
    194                                                        url = XHTMLTag.addUrlEncode( url, "GAMENID=" + getGUIInfoAttri( "KEY" ) );
    195                                                }
    196                                        }
    197                                }
    198                        }
    199
    200                        // 3.5.6.6 (2004/08/23) useRedirect 属性を追加
    201                        String url2 = XHTMLTag.addUrlEncode( url , urlEnc );
    202                        // 4.3.3.0 (2008/10/01) 追加
    203                        // if( noTransition ) {
    204                        if( noTransition || useAjaxSubmit ) { // 4.3.8.0 (2009/08/01) useAjaxSubmitと共用
    205                                // 5.0.0.4 (2009/10/01)
    206                                if( noTransition ) {
    207                                        int selRow = nval( getRequestValue( "SEL_ROW" ),-1 );
    208                                        if( selRow > 0 ) {
    209                                                url2 = XHTMLTag.addUrlEncode( url2, "SEL_ROW=" + selRow );
    210                                        }
    211                                }
    212                                if( useURLCheck ) { // 5.10.11.0 (2019/05/03) useURLCheck追加
    213                                        url2 = addURLCheck(url2);
    214                                }
    215                                jspPrint( "<div id=\"noTransitionUrl\">" + url2 + "</div>" );
    216                                jspPrint( "<div id=\"noTransitionTarget\">" + target + "</div>" );
    217                        }
    218
    219                        // 3.8.0.4 (2005/08/08) target 属性を追加します。
    220//                      else if( target != null ) {
    221                        else if( target != null && target.length() > 0 ) {
    222                                // 4.3.7.1 (2009/06/08)
    223                                String src = null;
    224                                if( useURLCheck ) { // 5.10.11.0 (2019/05/03) useURLCheck追加
    225                                        url2 = addURLCheck(url2);
    226                                }
    227
    228                                if( target.startsWith( "_b" ) ) { // "_blank"
    229                                        src = "window.open(\"" + url2 + "\", \"_blank\") ";
    230                                }
    231                                else {
    232                                        String frameTop = "";
    233                                        if( target.indexOf('.') < 0 ) { frameTop = "top."; }
    234                                        src = frameTop + target + ".location.href=\"" + url2 + "\"" + HybsSystem.CR;
    235                                }
    236//                              String script = "<script language=\"JavaScript\" ><!-- " + HybsSystem.CR
    237                                String script = "<script type=\"text/javascript\" ><!-- " + HybsSystem.CR
    238                                                                + src + HybsSystem.CR
    239                                                        + "// --></script>" ;
    240                                jspPrint( script );
    241                        }
    242                        else if( useRedirect ) {
    243                                if( useURLCheck ) { // 5.10.11.0 (2019/05/03) useURLCheck追加
    244                                        url2 = addURLCheck(url2);
    245                                }
    246                                // 5.6.5.0 (2013/06/07) redirectEncode 属性追加
    247                                if( redirectEncode != null ) {
    248                                        url2 = new String( url2.getBytes( redirectEncode ), "ISO-8859-1" );
    249                                }
    250                                response.sendRedirect( url2  );
    251                        }
    252                        else {
    253                                pageContext.forward( url2 );
    254                        }
    255                } catch(IOException ex) {
    256                        String errMsg = "フォワード/リダイレクトでIOエラーが発生しました。"
    257                                                                + HybsSystem.CR
    258                                                                + fwdUrl + "?" + urlEnc ;
    259                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    260                } catch( ServletException ex) {
    261                        String errMsg = "フォワード/リダイレクトでServletエラーが発生しました。"
    262                                                                + HybsSystem.CR
    263                                                                + fwdUrl + "?" + urlEnc ;
    264                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    265                }
    266
    267                // 3.0.1.3 (2003/03/11) forward で直接転送した場合の整合性を取る為の対応。
    268                // 5.1.7.0 (2010/06/01) 遷移先がJSP以外の場合は、フォワードページのキャッシュをしない。
    269                if( fwdUrl != null && fwdUrl.endsWith( ".jsp" ) ) {
    270                        setSessionAttribute( HybsSystem.FORWARD_PAGE_KEY, fwdUrl );     // 3.5.4.9 (2004/02/25)
    271                }
    272
    273                return(SKIP_PAGE);              // ページの残りの処理を行わない。
    274        }
    275
    276        /**
    277         * タグリブオブジェクトをリリースします。
    278         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    279         *
    280         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    281         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    282         * @og.rev 3.5.4.9 (2004/02/25) 画面ID属性(gamenId)を追加
    283         * @og.rev 3.8.5.0 (2006/03/06) filename 属性を追加します。
    284         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
    285         * @og.rev 5.6.5.0 (2013/06/07) redirectEncode 属性を追加します。
    286         * @og.rev 5.10.11.0 (2019/05/03) urlCheck対応
    287         * @og.rev 5.10.12.0 (2019/06/03) disposition
    288         *
    289         */
    290        @Override
    291        protected void release2() {
    292                super.release2();
    293                tableId         = HybsSystem.TBL_MDL_KEY;
    294                page            = null;
    295                keys            = null;
    296                dbkeys          = null;
    297                vals            = null;
    298                table           = null;
    299                gamenId         = null;
    300                useRedirect = false;    // 3.5.6.6 (2004/08/23) 追加
    301                target          = null;         // 3.8.0.4 (2005/08/08) 追加
    302                filename        = null;
    303                noTransition= false;    // 4.3.3.0 (2008/10/01) 追加
    304                useAjaxSubmit           = false;        // 4.3.8.0 (2009/08/01) 追加
    305                redirectEncode  = null;                 // 5.6.5.0 (2013/06/07) 追加
    306                useURLCheck             = HybsSystem.sysBool( "LINK_URL_CHECK" ); // 5.10.11.0 (2019/05/03)
    307                disposition     = "inline"; // 5.10.12.0 (2019/06/03)
    308        }
    309
    310        /**
    311         * keys 属性 を元に、request情報より values の値を取り込む。
    312         *
    313         * keys属性は キー情報がカンマ区切りになっている為,ばらして
    314         * values属性の配列に一つづつ設定していきます。
    315         *
    316         * @og.rev 3.1.7.0 (2003/05/02) 戻るボタン用のBACK_GAMENID を、引数に追加します。
    317         * @og.rev 3.1.8.0 (2003/05/16) 戻るボタン用のBACK_GAMENID の自動登録を廃止します。
    318         * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用するように変更
    319         *
    320         * @return      URLエンコードされた文字列
    321         */
    322        private String getUrlEncode() {
    323                String[] dbkey = StringUtil.csv2Array( dbkeys );
    324                String[] key   = StringUtil.csv2Array( keys );
    325
    326//              int dbCount = (dbkey != null) ? dbkey.length : 0 ;
    327//              int count   = (key   != null) ? key.length   : 0 ;
    328                int dbCount = dbkey.length;
    329                int count   = key.length  ;
    330
    331                String[] allKey = new String[ dbCount + count ];
    332                String[] allval = new String[ dbCount + count ];
    333
    334                int[] rowNo = getParameterRows();               // 4.0.0 (2005/01/31)
    335                if( dbCount > 0 && dbkey[0] != null && dbkey[0].length() > 0 && rowNo.length > 0 ) {
    336                        table = (DBTableModel)getObject( tableId );
    337                        if( table != null ) {
    338                                for( int i=0; i<dbCount; i++ ) {
    339                                        allKey[i] = dbkey[i];
    340                                        allval[i] = table.getValue(rowNo[0],table.getColumnNo( dbkey[i] ));
    341                                }
    342                        }
    343                }
    344
    345                if( count > 0 ) {
    346                        for( int i=0; i<count; i++ ) {
    347                                allKey[i+dbCount] = key[i];
    348                                allval[i+dbCount] = vals[i];
    349                        }
    350                }
    351
    352                return XHTMLTag.urlEncode( allKey,allval );
    353        }
    354
    355        /**
    356         * 【TAG】転送先URLを指定します。
    357         *
    358         * @og.tag 転送先URLを指定します。
    359         *
    360         * @param       url 転送先URL
    361         */
    362        public void setPage( final String url ) {
    363                page = getRequestParameter( url );
    364        }
    365
    366        /**
    367         * 【TAG】DBキーをCSV 形式でセットします。
    368         *
    369         * @og.tag
    370         * URI の引数にセットするキーを CSV 形式でセットします。
    371         * ここの指定は,DBTableModel 上のデータを取り込みます。
    372         *
    373         * @param       key DBキー(CSV 形式)
    374         */
    375        public void setDbkeys( final String key ) {
    376                dbkeys = getRequestParameter( key ) ;
    377        }
    378
    379        /**
    380         * 【TAG】キーを CSV 形式でセットします。
    381         *
    382         * @og.tag
    383         * URI の引数にセットするキーを CSV 形式でセットします。
    384         *
    385         * @param       key キー(CSV 形式)
    386         */
    387        public void setKeys( final String key ) {
    388                keys = getRequestParameter( key ) ;
    389        }
    390
    391        /**
    392         * 【TAG】キーに対応する値を CSV 形式でセットします。
    393         *
    394         * @og.tag
    395         * URI の引数にセットする値を CSV 形式でセットします。
    396         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    397         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    398         *
    399         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
    400         *
    401         * @param       val 値(CSV 形式)
    402         */
    403        public void setVals( final String val ) {
    404                vals = getCSVParameter( val );
    405
    406                // 先に分解しないとデータ自身にカンマを持っている場合に分解をミスる。
    407        }
    408
    409        /**
    410         * 画面ＩＤとpage から、フォワードするＵＲＬを作成します。
    411         * page が null の場合は、index.jsp に転送されます。
    412         *
    413         * @og.rev 3.5.4.9 (2004/02/25) 新規追加
    414         * @og.rev 3.5.5.0 (2004/03/12) URLを求めるのに、GUIInfo#getRealAddress() を使用する。
    415         * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。
    416         *
    417         * @return      フォワードするＵＲＬ(転送先URL)
    418         */
    419        private String makeGamenLink() {
    420                if( page == null ) { page = "index.jsp"; }
    421
    422                if( gamenId == null || gamenId.length() == 0 ) { return page; }
    423
    424                GUIInfo guiInfo = getGUIInfo( gamenId );
    425                if( guiInfo == null ) { // 見つからない場合は、転送しない
    426                        LogWriter.log( "Forward[" + gamenId + "]先にはアクセス不可です。" );
    427                        return page;
    428                }
    429
    430                String address = guiInfo.getRealAddress( page );
    431                String link = getRequestParameter( address );
    432
    433                // Ver 4.0.0 (2007/06/12) gamenId を使用する場合は、useRedirect = true をセット
    434                useRedirect = true;
    435                return link;
    436        }
    437
    438        /**
    439         * 【TAG】gamenId 属性を登録します。
    440         *
    441         * @og.tag
    442         * gamenId 属性は、画面IDをキーに、実アドレスを求めるのに使用します。
    443         * 画面IDが指定された場合は、実アドレスに変換する。指定されない場合は、
    444         * page 属性をそのままリダイレクトアドレスとします。
    445         * gamenId を指定した場合は、このuseRedirect属性に関係なく、Redirect されます。
    446         *
    447         * @og.rev 3.5.4.9 (2004/02/25) 新規追加
    448         *
    449         * @param   id gamenId 属性
    450         * @see         #setUseRedirect( String )
    451         */
    452        public void setGamenId( final String id ) {
    453                gamenId = nval( getRequestParameter( id ),gamenId );
    454        }
    455
    456        /**
    457         * 【TAG】response.sendRedirect するかどうか[true/false]を指定します(初期値:false)。
    458         *
    459         * @og.tag
    460         * useRedirect 属性は、URLの転送方式を指定できます。
    461         * 通常は、pageContext.forward しますが、この属性に true を
    462         * 設定すると、response.sendRedirect します。
    463         * gamenId を指定した場合は、この属性に関係なく、Redirect されます。
    464         * 初期値は、false (forward) です。
    465         *
    466         * @og.rev 3.5.6.6 (2004/08/23) 新規追加
    467         *
    468         * @param   flag useRedirect 属性 [false:forwrd/true:redirect]
    469         * @see         #setGamenId( String )
    470         */
    471        public void setUseRedirect( final String flag ) {
    472                useRedirect = nval( getRequestParameter( flag ),useRedirect );
    473        }
    474
    475        /**
    476         * 【TAG】サブミット先の文書を表示させるフレーム、またはウィンドウの名前を指定します。
    477         *
    478         * @og.tag サブミット先のフレーム名(ターゲット属性)を設定します。
    479         *
    480         * @og.rev 3.8.0.4 (2005/08/08) 新規追加
    481         *
    482         * @param       flag サブミット先の文書のフレーム名(ターゲット属性)
    483         */
    484        public void setTarget( final String flag ) {
    485                target = nval( getRequestParameter( flag ),target );
    486        }
    487
    488        /**
    489         * 【TAG】ファイル転送時にファイル名の別名を指定します(初期値:null)。
    490         *
    491         * @og.tag
    492         * ファイルを転送する場合に、オープンさせるファイル名を指定します。
    493         * 指定しない場合は、フォラード前に呼び出されたアドレスがそのまま使用されます。
    494         *
    495         * @param   name ファイル名
    496         */
    497        public void setFilename( final String name ) {
    498                filename = nval( getRequestParameter( name ),filename );
    499        }
    500
    501        /**
    502         * 【TAG】ファイルダウンロードさせる場合に、Content-Disposition に設定する値
    503         *
    504         * @og.tag
    505         * inline(そのまま開く) を指定すると、画面表示が基本です。
    506         * PDF などは直接ダウンロードが始まります。
    507         * attachment(ダウンロードダイアログを表示する) を指定すると、保存のダイアログを表示します。
    508         * ただ、サーバやブラウザによって挙動が変わる事があるようです。
    509         *
    510         *
    511         * @og.rev 5.10.12.0 (2019/06/03) 6.4.3.0の移植で新規追加
    512         *
    513         * @param   dispos Content-Dispositionに設定する値(inline/attachment)
    514         */
    515        public void setDisposition( final String dispos ) {
    516                final String temp = nval( getRequestParameter( dispos ),disposition );
    517
    518                if( "inline".equals( temp ) || "attachment".equals( temp ) ) {
    519                        disposition = temp;
    520                }
    521                else {
    522                        final String errMsg = "disposition 属性は、[inline/attachment] から、指定してください。"
    523                                                                + " disposition=[" + dispos + "]";
    524                        throw new HybsSystemException( errMsg );
    525                }
    526        }
    527
    528        /**
    529         * 【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します。
    530         *
    531         * @og.tag
    532         * 画面遷移なしの登録を行うかどうかを指定します。
    533         * trueが指定された場合、forwardタグでは、実際の画面遷移は行わずに、forward先の
    534         * URLを<div id="noTransitionUrl">[URL]</div>の形でHTMLとして出力し、JavaScript側で
    535         * 実際の画面遷移を発生させます。target属性は<div id="noTransitionTarget">[TARGET]</div>で
    536         * 出力されます。
    537         *
    538         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
    539         *
    540         * @og.rev 4.3.3.0 (2008/10/01) 新規追加
    541         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
    542         *
    543         * @param   noTrnstn 画面遷移を行わない形式の登録方法を使用するか
    544         */
    545        public void setNoTransition( final String noTrnstn ) {
    546//              noTransition = nval( getRequestParameter( noTrnstn ), noTransition );
    547                setNoTransitionRequest( nval( getRequestParameter( noTrnstn ), isNoTransitionRequest() ) );
    548        }
    549
    550        /**
    551         * 【TAG】(通常は使いません)ajaxを利用したsubmitを利用するかどうかを指定します。
    552         *
    553         * @og.tag
    554         * ajaxを利用したSubmit処理を行うかどうかを指定します。
    555         * setNoTransitionをtrueにした場合と同様の処理を行います。
    556         * (forwardせずにURLをDIVタグで出力する)
    557         *
    558         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
    559         *
    560         * @og.rev 4.3.8.0 (2009/08/01) 新規追加
    561         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
    562         *
    563         * @param   ajaxSubmit ajaxを利用したsubmitを利用するかどうか
    564         */
    565        public void setUseAjaxSubmit( final String ajaxSubmit ) {
    566//              useAjaxSubmit = nval( getRequestParameter( ajaxSubmit ), useAjaxSubmit );
    567                setAjaxSubmitRequest( nval( getRequestParameter( ajaxSubmit ), isAjaxSubmitRequest() ) );
    568        }
    569
    570        /**
    571         * 【TAG】(通常は使いません)useRedirect=true時に 日本語を含む転送先(page)をバイナリ変換するときのコード名[UTF-8/Windows-31J]など(初期値:null)
    572         *
    573         * @og.tag
    574         * 日本語ファイル名を持つ URL を useRedirect で転送する場合に、転送先(page)をバイナリ変換しないと、転送できないケースがあります。
    575         * このあたりは、ブラウザにも依存するので、既存の処理に影響しない様に、このパラメータを使用する場合のみ
    576         * 処理を実行します。
    577         * IEでの日本語ファイル転送で、うまくいかない場合の、暫定処置です。
    578         * IEの場合は、redirectEncode="UTF-8" で、日本語ファイルを転送できます。
    579         * ただし、useRedirect=true時に filename 属性によるファイル名の書き換え処理はできませんので、ご注意ください。
    580         * 初期値は、null で、バイナリエンコードしません。（互換性ありの状態です。）
    581         *
    582         * @og.rev 5.6.5.0 (2013/06/07) 新規追加
    583         *
    584         * @param   redEnc URL を 転送する場合に、日本語を含む転送先(page)をバイナリ変換するときのコード名
    585         */
    586        public void setRedirectEncode( final String redEnc ) {
    587                redirectEncode = nval( getRequestParameter( redEnc ), redirectEncode );
    588        }
    589
    590        /**
    591         * 【TAG】リンクアドレスにURLチェック用の確認キーを付加するかどうか[true/false]を指定します。
    592         *
    593         * @og.tag
    594         * この属性は、URLCheckFilter(org.opengion.hayabusa.filter.URLCheckFilter)と合わせて使用します。
    595         * trueが指定された場合、リンクURLのパラメーターに、URL確認用のパラメーターが出力されます。
    596         * このパラメーターを、URLCheckFilterが復号化し、正式なアクセスであるかどうかの判定を行います。
    597         *
    598         * 初期値は、 システムリソースのLINK_URL_CHECK です。
    599         *
    600         * @og.rev 5.10.11.0 (2019/05/03) 新規追加
    601         *
    602         * @param       flag 暗号化するかかどうか [true:暗号化する/false:しない]
    603         * @see org.opengion.hayabusa.filter.URLCheckFilter
    604         */
    605        public void setUseURLCheck( final String flag ) {
    606                useURLCheck = nval( getRequestParameter( flag ),useURLCheck );
    607        }
    608
    609        /**
    610         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    611         *
    612         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    613         * @serialData 一部のオブジェクトは、シリアライズされません。
    614         *
    615         * @param       strm    ObjectOutputStreamオブジェクト
    616         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    617         */
    618        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    619                strm.defaultWriteObject();
    620        }
    621
    622        /**
    623         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    624         *
    625         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    626         *
    627         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    628         * @serialData 一部のオブジェクトは、シリアライズされません。
    629         *
    630         * @param       strm    ObjectInputStreamオブジェクト
    631         * @see #release2()
    632         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    633         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    634         */
    635        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    636                strm.defaultReadObject();
    637        }
    638
    639        /**
    640         * urlCheckのパラメータを付加します。
    641         *
    642         * @param url 元のアドレス
    643         * @return urlCheckを付加したアドレス
    644         */
    645        private String addURLCheck( final String url ) {
    646                HybsCryptography criptCls = null;
    647                if( urlCheckCrypt != null && urlCheckCrypt.length() > 0 ){
    648                        criptCls = new HybsCryptography( urlCheckCrypt );
    649                }
    650                return XHTMLTag.addURLCheckKey( url, HybsSystem.URL_CHECK_KEY, getUser().getUserID(), System.currentTimeMillis() + urlCheckTime, criptCls );
    651        }
    652
    653        /**
    654         * このオブジェクトの文字列表現を返します。
    655         * 基本的にデバッグ目的に使用します。
    656         *
    657         * @return このクラスの文字列表現
    658         */
    659        @Override
    660        public String toString() {
    661                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    662                                .println( "VERSION"             ,VERSION        )
    663                                .println( "tableId"             ,tableId        )
    664                                .println( "page"                ,page           )
    665                                .println( "keys"                ,keys           )
    666                                .println( "dbkeys"              ,dbkeys         )
    667                                .println( "vals"                ,vals           )
    668                                .println( "gamenId"             ,gamenId        )
    669                                .println( "useRedirect" ,useRedirect)
    670                                .println( "target"              ,target         )
    671                                .println( "filename"    ,filename       )
    672                                .println( "disposition"         ,disposition    )
    673                                .println( "noTransition"        ,noTransition   )
    674                                .println( "useAjaxSubmit"       ,useAjaxSubmit  )
    675                                .println( "redirectEncode"      ,redirectEncode )
    676                                .println( "useURLCheck" ,useURLCheck    )
    677                                .println( "Other..."    ,getAttributes().getAttribute() )
    678                                .fixForm().toString() ;
    679        }
    680}