ラベル Tomcat の投稿を表示しています。 すべての投稿を表示
ラベル Tomcat の投稿を表示しています。 すべての投稿を表示

2008年12月6日土曜日

Webアプリの再起動

「conf/tomcat-users.xml」
のmanagerロールで管理されていますので


<user name    ="アカウント" 
      password="パスワード"
      role    ="manager"/>


を設定しておきます。

その後、 
http://ドメイン/manager/reload?path=/Webアプリのパス
にアクセスすると
追加してあるユーザをBASIC認証してきます。
そこにユーザ名とパスワードを設定してください。

アプリケーションが再起動します。
(ポートも指定してください)

Web+APでコネクトして隠したとしても
私みたいに全通ししているとアクセス可能です。
よって攻めないでください。
(外部からも再起動可能って事です)

Javaのサーバモード

起動方式を変更します。

以前仕事で(その時はWindowsサーバ)で
デフォルトで結合試験を通り、いざシステムテストの負荷テストを
行ったら、でかいクエリを10発連続で飛ばしたら止まりました。。。

はてさてなんでだろう。。。とやっていて、
コネクション数、セッション継続時間、ソケット有効とかも変更しましたが
一応以下の文面も追加しました。

メモリを変更しないと動かない時が多かったので
これがわかりやすい問題の1つでした。
調べると難しい話しも多いのですが、
システム搭載の物理メモリの半分ぐらい使って良いのではないでしょうか?

アウトオブメモリに陥ったらどうぞお試しあれ。
※実装を直す暇があれば、適切かどうかを試すのが賢明かも。

環境変数に


CATALINA_OPTS=-Xmx256M -Xms256M -Xss256K -server


を追加します。
そうすると起動時に環境変数として盛り込まれます。

但し、Windowsのサービス起動(Tomcat.exe)だと、
この変数の影響がでない現象がありました。
何やらサービスの起動はレジストリからVMの値を
決定しているらしい。。。という結論に至りました。

Tomcatエラーページの指定

サーバ上でエラーとなった場合、エラーページを指定する事ができます。

<error-page>
  <error-code>404</error-code>
  <location>/error/notfound.html</localtion>
</error-page>

と指定するとNotFoundを自分の好きなページで表示する事ができます。
400:不正なリクエスト

401:無許可
403:禁止されている
408:サーバが応答しない
500:サーバ側で何らかの問題発生

となります。
BASIC認証時は401を指定していると
いきなりエラーページにとんだことがあります。
これはBASIC認証を勉強すれば、わかります。

Javaの例外を捕まえたい場合は

<error-page>
  <exception-type>java.io.FileNotFoundException</exception-type>
  <location>/error/filenotfound.html</localtion>
</error-page>

とできるようです。
。。。。Struts等を使いたい場合、
例外はtry処理等した方が良いと思いますが。。。

Tomcatで認証

「認証情報がなければ、FORMページへリダイレクト」といった
アプリケーションはしばしば見受けられますが、
Tomcat(他を知りませんが)はweb.xmlの編集で認証を
フォルダ、ファイル単位でかけることが可能になります。


それではPostgreSQLのテーブルを使って認証してみましょう。

データベース作成はPostgreSQLの項にありますので見てみてください。
Tomcat5だと./common/libに
JDBCドライバが存在する事が条件です。
Tomcat6では./libになります。

server.xml内にある200行目位です。

 <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
        driverName="org.postgresql.Driver" 
          connectionURL="jdbc:postgresql://サーバ名/データベース名?
          user=ユーザ&password=パスワード"
        userTable="users"
        userNameCol="user_name"
        userCredCol="user_pass"
        userRoleTable="user_roles"
        roleNameCol="role_name"/>

って感じで編集します。

その後、アプリケーションのweb.xmlにおいて以下を追加します。


  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Volunteer Manager ID</web-resource-name>
      <url-pattern>/manage/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>admin</role-name>
      <role-name>design</role-name>
    </auth-constraint>
  </security-constraint>
  
  <login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>Volunteer Manager ID</realm-name>
  </login-config>

  <security-role>
    <role-name>admin</role-name>
    <role-name>design</role-name>
  </security-role>


これで指定したパスはセキュリティがかかります。

サーブレットでエンコード

すべてのレスポンスを統一したコードに変換する方式は
web.xmlに以下を記述します。


 <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>filter.EncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
 </filter>

 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <servlet-name>action</servlet-name>
 </filter-mapping>


まぁこれはStruts用なのでservlet-nameはactionになっていますが、
それぞれの名称にあわせてください。

このクラスに


/**
 * Tomcatコード変換フィルター
 */
public class EncodingFilter implements Filter {

  String encName;

  /**
   * 初期化処理<br>
   * エンコード名を取得
   */
  public void init(FilterConfig config) throws ServletException {
    // TODO 自動生成されたメソッド・スタブ
    encName = config.getInitParameter("encoding");
  }

  /**
   * 実行処理
   */
  public void doFilter(ServletRequest request,
                       ServletResponse response,
                       FilterChain chain) 
                      throws IOException, ServletException {
    request.setCharacterEncoding(encName);
    chain.doFilter(request, response);
  }
}


としておけばOKです。
initでコード名を取ってきていますが、
実装に依存させても大丈夫です。