私は、ユーザーが多くのデータを検索する正規表現を送信できるサービスを実行しているとします。ユーザーが非常に遅い(Matcher.find()が戻るまでに数分かかる)正規表現を送信した場合、その一致を取り消す方法が必要です。私がこれを行うと考えることができる唯一の方法は、別のスレッドが一致を取る時間を監視し、必要に応じてそれを取り消すためにThread.stop()を使用することです。長時間実行されている正規表現の一致をキャンセルしますか?
メンバ変数:
long REGEX_TIMEOUT = 30000L;
Object lock = new Object();
boolean finished = false;
Thread matcherThread;
のMatcherスレッド:
try {
matcherThread = Thread.currentThread();
// imagine code to start monitor thread is here
try {
matched = matcher.find();
} finally {
synchronized (lock) {
finished = true;
lock.notifyAll();
}
}
} catch (ThreadDeath td) {
// send angry message to client
// handle error without rethrowing td
}
モニタースレッド:私はjava.sun.com/j2se/1.4.2/を読んだ
synchronized (lock) {
while (! finished) {
try {
lock.wait(REGEX_TIMEOUT);
if (! finished) {
matcherThread.stop();
}
} catch (InterruptedException ex) {
// ignore, top level method in dedicated thread, etc..
}
}
}
docs/guide/misc/threadPrimitiveDeprecation.htmlと私は、同期とハを介してThreadDeathがスローされる場所を制御しているので、この使用法は安全だと思いますそれを無視して、壊れた唯一のオブジェクトは、とにかく破棄される私のパターンとマッチャーのインスタンスになる可能性があります。私はこれがThread.stop()を中断していると思います。なぜなら、エラーを再現しているわけではないからです。しかし、スレッドが死んでしまわないようにするために、find()メソッドを中止するだけです。
これまで廃止予定だったAPIコンポーネントの使用を避けましたが、Matcher.find()は中断されておらず、返却に非常に時間がかかることがあります。これを行うための良い方法はありますか? Heritrixから
個人的には、ユーザーが検索条件として正規表現を提出できるようにするのは悪い考えです。プログラマーはおそらくエンドユーザーではないかもしれません... –
もしあなたが任意の正規表現を受け入れるなら、確かにあなたはDoSedを得るべきです。 –
すべてのコードがDoSを心配する必要があるパブリックネットワークに公開されているわけではありません。 – Jared