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.servlet; 017 018import java.io.UnsupportedEncodingException; 019import java.io.IOException; 020 021import jakarta.servlet.ServletException; 022import jakarta.servlet.ServletConfig; 023// import jakarta.servlet.RequestDispatcher; 024import jakarta.servlet.http.HttpServlet; 025import jakarta.servlet.http.HttpServletRequest; 026import jakarta.servlet.http.HttpServletResponse; 027 028import jakarta.servlet.annotation.WebInitParam; // 7.3.0.0 (2021/01/06) 029import jakarta.servlet.annotation.WebServlet; // 7.3.0.0 (2021/01/06) 030 031import org.opengion.hayabusa.common.HybsSystemException; 032 033/** 034 * FORM認証で、認証済みの場合、j_security_check に飛ばされてエラーになるので、強制的に sendRedirect する。 035 * Post,Get両方に対応しています。 036 * 037 * @og.rev 7.3.0.0 (2021/01/06) 新規作成。 038 * @version 7.3 039 * @author Kazuhiko Hasegawa 040 * @since JDK11 041 * 042 */ 043@WebServlet( 044 urlPatterns = "/jsp/j_security_check" , 045 initParams = { 046 @WebInitParam(name="forwardURL", value="/jsp/index.jsp") 047 } 048) 049public class JSecurityCheckServlet extends HttpServlet { 050 private static final long serialVersionUID = 730020210106L ; 051 052 /** 転送先の URLアドレス */ 053 private String forwardURL = "/jsp/index.jsp" ; 054 055 /** 056 * デフォルトコンストラクター 057 * 058 * @og.rev 7.3.0.0 (2021/01/06) 新規作成。 059 */ 060 public JSecurityCheckServlet() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 061 062 /** 063 * Servlet の 初期値設定を行います。 064 * 065 * @og.rev 7.3.0.0 (2021/01/06) 新規作成。 066 * 067 * WEB-INF/web.xml ファイルで、<servlet> タグ内で初期値設定を行います。 068 * <init-param> 069 * <param-name>forwardURL</param-name> 070 * <param-value>/jsp/index.jsp</param-value> 071 * </init-param> 072 * 073 * @param config ServletConfigオブジェクト 074 */ 075 @Override 076 public void init( final ServletConfig config ) throws ServletException { 077 super.init( config ); 078 079 final String url = config.getInitParameter("forwardURL"); 080 if( url != null && !url.isEmpty() ) { 081 forwardURL = url; 082 } 083 } 084 085 /** 086 * Getメソッドで与えられたrequestをcallClassメソッドに渡します。 087 * callClassメソッドではclassパラメータの値を利用してクラスをロードし、処理を行います。 088 * 具体的な処理はcallClassメソッドをご覧下さい。 089 * 090 * @og.rev 7.3.0.0 (2021/01/06) 新規作成。 091 * 092 * @param request HttpServletRequestリクエスト 093 * @param response HttpServletResponseレスポンス 094 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 095 * @throws IOException 入出力エラーが発生したとき 096 */ 097 @Override 098 public void doGet( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException,IOException { 099 callClass( request, response ); 100 } 101 102 /** 103 * Postメソッドで与えられたrequestをcallClassメソッドに渡します。 104 * callClassメソッドではclassパラメータの値を利用してクラスをロードし、処理を行います。 105 * 具体的な処理はcallClassメソッドをご覧下さい。 106 * 107 * @og.rev 7.3.0.0 (2021/01/06) 新規作成。 108 * 109 * @param request HttpServletRequestリクエスト 110 * @param response HttpServletResponseレスポンス 111 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 112 * @throws IOException 入出力エラーが発生したとき 113 */ 114 @Override 115 public void doPost( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException,IOException { 116 callClass( request, response ); 117 } 118 119 /** 120 * POSTとGETに対する実際の処理です 121 * sendRedirect先の URL をforwardURL で初期設定されたアドレスに転送します。 122 * 123 * @param request リクエスト 124 * @param response レスポンス 125 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 126 * @throws IOException 入出力エラーが発生したとき 127 */ 128 private void callClass( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException,IOException { 129 try { 130 request.setCharacterEncoding( "UTF-8" ); 131 } 132 catch( final UnsupportedEncodingException ex ) { 133 throw new HybsSystemException( ex ); 134 } 135 136 // forward は、元のアドレスが残ってしまう。 137 // final RequestDispatcher dispatch = request.getRequestDispatcher(forwardURL); 138 // dispatch.forward(request, response); 139 140 String url = "/" ; 141 if( request.authenticate(response) ) { // 認証済みの場合に、もう一度呼ばれると、true になっている。 142 final String refe = request.getHeader( "referer" ); // 元のアドレスにリダイレクトする。 143 if( refe != null && !refe.isEmpty() ) { url = refe; } 144 } 145 else { 146 // sendRedirect で、アドレスを変えてしまう。 147 // ただし、forward は、自分のコンテキスト基準だが、sendRedirect はアプリケーション基準 148 final String cntxPath = request.getContextPath(); // /gf などのコンテキストパス 149 url = cntxPath + forwardURL ; 150 } 151 response.sendRedirect(url); 152 } 153}