Tomcat 例外の解決方法 (リクエスト ターゲットに無効な文字が見つかりました。有効な文字は RFC 7230 および RFC 3986 で定義されています)

Tomcat 例外の解決方法 (リクエスト ターゲットに無効な文字が見つかりました。有効な文字は RFC 7230 および RFC 3986 で定義されています)

1. シナリオ表示

Tomcat ログに次の例外情報が時々報告されます。何が起こっているのでしょうか?

java.lang.IllegalArgumentException: リクエストターゲットに無効な文字が見つかりました。有効な文字は RFC 7230 および RFC 3986 で定義されています。
    org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:283) で
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017) で
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) で
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) で
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) で
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) で
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) で
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) で
    java.lang.Thread.run(Thread.java:745) で

ページを開くことができません

2. 原因分析

これは、リクエスト ヘッダーに RFC 7230 および RFC 3986 仕様で定義されている不正な文字が含まれていることを意味し、これによりページで 400 例外が報告されます。

理由は、Tomcat のバージョンが高すぎるためです。インターネットでは、Tomcat バージョン 7.0.73 以降では、http ヘッダー (リクエスト ヘッダー) の検証が追加されると言われています。

リクエストの取得、つまり疑問符を渡すパラメータは、リクエストヘッダーのみがあり、リクエスト本体がないことを意味します。

RFC3986 ドキュメントでは、URL には英語の文字 (a-zA-Z)、数字 (0-9)、-_.~4 の特殊文字、およびすべての予約文字のみを含めることができると規定されています。

RFC3986 では、次の文字を予約文字として指定しています: ! * ' ( ) ; : @ & = + $ , / ? # [ ]

同時に、RFC 3986 仕様は Tomcat 7.0.73 バージョンですでに提案されており、RFC 7230 も前者の補足または改良であるため、この問題は Tomcat 7.0.73 以降で発生します。

注: この状況は IE ブラウザでのみ発生します。IE ブラウザは中国語のパラメータをエンコードしませんが、他の種類のブラウザはデフォルトで自動的に中国語をエンコードします。

3. 解決策

方法 1: Tomcat のバージョンを下げる。

テストの結果、インターネット上の Tomcat の最大バージョン要件の説明が間違っていることが判明しました。7.0.73 より低いバージョンである必要はありません。

tomcat7.0.70 をダウンロードしました。プロジェクトを実行した後も、文字セット エラーが残っており、Web ページを開くことができませんでした。

しかし、tomcat7.0.61 をテストしたところ、プロジェクトは完全に正常に実行されました。コンソールにエラーが報告されなくなり、Web ページを正常に開くことができました。

64 ビットのダウンロード アドレス: https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61-windows-x64.zip

32 ビットのダウンロード アドレス: https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61-windows-x86.zip

方法 2: GET リクエストを POST リクエストに変更する (推奨)

方法3: リクエストの取得(疑問符パラメータの受け渡し)

URIEncoder()関数を使用して中国語の文字をエンコードする

以上がTomcat例外解決方法(リクエスト対象に無効な文字が見つかりました。有効な文字はRFC 7230とRFC 3986で定義されています)の詳細な内容です。Tomcat例外解決方法の詳細については、123WORDPRESS.COMの他の関連記事に注目してください!

以下もご興味があるかもしれません:
  • Tomcat の一般的な例外と解決コードの例
  • SpringBoot プロジェクトがパッケージ化され、外部の Tomcat に公開されます (さまざまな例外を解決)
  • セマフォによるTomcatの異常終了の解決方法
  • Tomcat での jar のロードに関する異常な問題の分析と解決
  • tomcat6 の jsp でこの応答に対して getOutputStream() が既に呼び出されている例外の原因と解決策
  • tomcat の起動時にエラーが発生しました: プロキシが例外をスローしました: java.rmi.server.ExportException: ポートは既に使用されています: 1099 解決策
  • idea2020.2 が pom.xml ファイル Maven プラグイン tomcat7 でエラーに遭遇する問題を解決する
  • IDEA 構成の Tomcat 起動エラーの問題を解決する
  • SSM プロジェクトを Idea にインポートした後、Tomcat を起動するとエラー 404 が発生する問題を解決します。
  • Tomcat 起動エラー: java.util.zip.ZipException の解決方法

<<:  MySQL データベースのバックアップ プロセスに関する注意事項

>>:  js を使用して USB スキャナー データを取得する方法

推薦する

動的テーブルを実装するための要素サンプルコード

目次【コード背景】 【コード実装】 #1# -> コード再利用の基本は、再利用可能なコンポーネ...

CSS フレックスベースのテキストオーバーフロー問題の解決方法

重要でないflex-basisテキストオーバーフローに省略記号を追加するという小さな機能に多くの問題...

CentOS 6.x のインストール時に発生するエラー「ディスク sda に BIOS RAID メタデータが含まれています」の解決方法

今日、CentOS6.2 をインストールしていたところ、ハード ドライブの検出段階を通過できませんで...

JSはjQueryのappend関数を実装します

目次コードを見せてください効果をテストする効果追伸別のアプローチコードを見せてください HTMLEl...

Vue-router プログラムナビゲーションの 2 つの実装コード

ページをナビゲートする2つの方法宣言型ナビゲーション: リンクをクリックしてナビゲーションを実現する...

Videojs+swiper が Taobao の商品詳細カルーセルを実現

この記事では、Taobao商品詳細のカルーセルを実現するためのvideojs+swiperの具体的な...

JS配列ループ方式と効率分析の比較

配列メソッドJavaScript には多くの配列メソッドが用意されています。次の図は、ほとんどの配列...

デザイン理論:人の心を理解する方法

<br />かつて、仏印と東坡氏が仏教について雑談していたとき、東坡氏が突然こう言った。...

CocosCreatorの共通知識ポイントを整理する

目次1. シーンの読み込み2. ノードを見つける1. ノード検索2. その他のノード操作3. 再生ア...

Linux に MySQL 8.0.19 をインストールするための詳細な手順と問題解決方法

最近Tencent Cloudサーバーを購入し、環境を構築しました。このメモは、これまで MySQL...

MySQL の暗黙的な型変換によって発生するインデックス障害の解決策

目次質問再生暗黙的な変換要約する参照する質問仕事中、1 つの SQL クエリ ステートメントのみを実...

formData 形式タイプを使用してファイルをアップロードする Vue の例

Vue では、一般的にフロントエンドとバックエンドを分離したプロジェクトがあり、データ操作を実装する...

Linux システムの仮想ホストで Swoole Loader 拡張機能を有効にする方法

特記事項: Swoole 拡張機能のみがインストールされ、サーバーはホストにインストールされません。...

JS が WeChat の「クソ爆弾」機能を実装

みなさんこんにちは、Qiufengです。最近、WeChatは新しい機能をリリースしました(WeCha...