@Controller
public class AController{
@Autowire
HttpServletRequest request;
@RequestMapping("/test")
public Result test(){
System.out.println(request.toString());
request.getHeader("uid");
}
}
例如上述代码,
我使用Autowire
注入request
后,直接在controller
的方法中使用request
,
由于controller
默认是单例的,我在想是否会有线程安全问题。
因为我输出了request
的hashcode
发现每次请求hashcode
都是一样的。
那么后面的request
是否会覆盖当前request
导致信息失真?
·····························补充··························
1、我想在controller
的每个方法里都使用HttpServletRequest
,那么每次在方法里都要声明我觉得就比较麻烦了?不知道大家怎么解决这个问题?
2、我这样写的原因是,我想通过继承一个父类的方式,让request作为父类的一个成员变量,这样可以在方法里直接使用。
3、我通过楼下叉叉哥的方式(之前就是这样写的)
public Result test(HttpServletRequest request){
System.out.println(request.toString());
}
同样不断访问,或者用不同客户端访问。发现打印出来的每个请求的request的hashcode居然也是相同的,为什么?
巴扎黑2017-04-17 17:59:04
ご回答いただきありがとうございます
テストと調査の結果。
結論は、@autowire
を使用した HttpServletRequest の挿入はスレッドセーフであるということです。
具体的な検証プロセスについてはブログに書きました
興味のある方はご覧ください、もし間違っているところがあればご指摘ください。
私の質問に熱心に答えてくれた上の階のプログラマーに改めて感謝します
クリックするとブログのアドレスが表示されます
追記: 上記の説明はすべてシングルトン モードのコントローラーに関するものです
···
大家讲道理2017-04-17 17:59:04
まず、原則として、Request をコントローラーのメンバーとして定義することはできません。これは、2 つのライフサイクルが完全に切り離されているため、コントローラーは正しい Request オブジェクトを呼び出すことができなくなるだけです。
第二に、@Autowire は 1 回限りの割り当てであり、無数の Request オブジェクトがあるため、このように書くと Spring は何をすればよいのかわかりません。アプリケーションの起動時には Request オブジェクトが存在しないため、起動が失敗する可能性があります。
PHP中文网2017-04-17 17:59:04
あの、毎回マイナーなrequest
同じ問題を解くことに集中して、テーマを忘れてしまったのが馬鹿でした。
追加@ModelAttribute
スレッドの安全性の問題が発生するのは事実です!
...
オブジェクト属性を使用してスレッドセーフを処理したい場合は、非常に簡単な方法がありますが、は特に大まかです。これを直接使用して @Scope("prototype")
Spring MVC に新しい属性を生成させます。各リクエスト。エンティティクラス...
しかし、なぜ Spring MVC はデフォルトでシングルトンを必要とするのでしょうか?当然のことながら、シングルトンにはパフォーマンスとコストの利点があるため、
と @Scope("prototype")
を記述することは、シングルトンの利点を放棄することを意味します。
これは確かに方法ですが、皆さんを困らせてしまいます、申し訳ありません。
リーリー迷茫2017-04-17 17:59:04
1. Autowire がリクエストを挿入した後、インスタンス変数を使用するとセキュリティの問題が発生します
2. ハッシュコードは同じオブジェクトのままです
リーリー
PHPz2017-04-17 17:59:04
この書き方は初めて見ました、こう書いてみてはいかがでしょうか?
リーリー実際、ほとんどの場合、リクエストをパラメータとして渡す必要はありません。たとえば、リクエスト ヘッダーの uid を取得したい場合は、次のように記述できます。 リーリー
阿神2017-04-17 17:59:04
そのように書くと確実にスレッドセーフの問題が発生します。 Spring の各コントローラーはデフォルトでシングルトンなので、リクエストが他のスレッドに共有されてしまうため、以下と同じように書くことをお勧めします。ちゃちゃ哥。
PHP中文网2017-04-17 17:59:04
このように記述すると、コントローラーはデフォルトでシングルトンであるため、スレッド セーフティの問題が確実に発生します。これは、@Scope("prototype") を追加すると、複数のリクエストが HttpServletRequest オブジェクトを共有することを意味します。問題ありません
巴扎黑2017-04-17 17:59:04
どのクラス インスタンス変数にも潜在的なスレッド セーフティ リスクが存在します。コードでは、インスタンス変数が複数のスレッドで安全であることを確認するか、クラスが同時に 1 つのスレッドのみによってアクセスされることを確認する必要があります。
あなたの例におけるマルチスレッドの問題は避けられません。Spring チュートリアルに従って、まず物事を正しく理解してから、複雑な問題に進む必要があります。