検索

ホームページ  >  に質問  >  本文

java - Springmvc中在controller注入request会有线程安全问题吗

@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默认是单例的,我在想是否会有线程安全问题。
因为我输出了requesthashcode发现每次请求hashcode都是一样的。
那么后面的request是否会覆盖当前request导致信息失真?

·····························补充··························

1、我想在controller的每个方法里都使用HttpServletRequest,那么每次在方法里都要声明我觉得就比较麻烦了?不知道大家怎么解决这个问题?
2、我这样写的原因是,我想通过继承一个父类的方式,让request作为父类的一个成员变量,这样可以在方法里直接使用。
3、我通过楼下叉叉哥的方式(之前就是这样写的)

public Result test(HttpServletRequest request){

    System.out.println(request.toString());
}

同样不断访问,或者用不同客户端访问。发现打印出来的每个请求的request的hashcode居然也是相同的,为什么?

高洛峰高洛峰2888日前573

全員に返信(10)返信します

  • 巴扎黑

    巴扎黑2017-04-17 17:59:04

    ご回答いただきありがとうございます
    テストと調査の結果。
    結論は、
    @autowire を使用した HttpServletRequest の挿入はスレッドセーフであるということです。
    具体的な検証プロセスについてはブログに書きました
    興味のある方はご覧ください、もし間違っているところがあればご指摘ください。
    私の質問に熱心に答えてくれた上の階のプログラマーに改めて感謝します

    クリックするとブログのアドレスが表示されます

    追記: 上記の説明はすべてシングルトン モードのコントローラーに関するものです

    ···

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:59:04

    まず、原則として、Request をコントローラーのメンバーとして定義することはできません。これは、2 つのライフサイクルが完全に切り離されているため、コントローラーは正しい Request オブジェクトを呼び出すことができなくなるだけです。

    第二に、@Autowire は 1 回限りの割り当てであり、無数の Request オブジェクトがあるため、このように書くと Spring は何をすればよいのかわかりません。アプリケーションの起動時には Request オブジェクトが存在しないため、起動が失敗する可能性があります。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:59:04

    あの、毎回マイナーなrequest同じ問題を解くことに集中して、テーマを忘れてしまったのが馬鹿でした。
    追加@ModelAttributeスレッドの安全性の問題が発生するのは事実です!
    ...

    オブジェクト属性を使用してスレッドセーフを処理したい場合は、非常に簡単な方法がありますが、は特に大まかです。これを直接使用して @Scope("prototype") Spring MVC に新しい属性を生成させます。各リクエスト。エンティティクラス...
    しかし、なぜ Spring MVC はデフォルトでシングルトンを必要とするのでしょうか?当然のことながら、シングルトンにはパフォーマンスとコストの利点があるため、
    @Scope("prototype") を記述することは、シングルトンの利点を放棄することを意味します。

    これは確かに方法ですが、皆さんを困らせてしまいます、申し訳ありません。

    リーリー

    返事
    0
  • 迷茫

    迷茫2017-04-17 17:59:04

    1. Autowire がリクエストを挿入した後、インスタンス変数を使用するとセキュリティの問題が発生します
    2. ハッシュコードは同じオブジェクトのままです

    メソッドにパラメータを書くのは面倒だと思うので、こうしても良いです:

    リーリー

    返事
    0
  • PHPz

    PHPz2017-04-17 17:59:04

    この書き方は初めて見ました、こう書いてみてはいかがでしょうか?

    リーリー

    実際、ほとんどの場合、リクエストをパラメータとして渡す必要はありません。たとえば、リクエスト ヘッダーの uid を取得したい場合は、次のように記述できます。 リーリー

    返事
    0
  • 阿神

    阿神2017-04-17 17:59:04

    そのように書くと確実にスレッドセーフの問題が発生します。 Spring の各コントローラーはデフォルトでシングルトンなので、リクエストが他のスレッドに共有されてしまうため、以下と同じように書くことをお勧めします。ちゃちゃ哥。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:59:04

    あるでしょう。サーブレットでは属性パラメータは共有されないようにメソッド内に記述します

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:59:04

    このように記述すると、コントローラーはデフォルトでシングルトンであるため、スレッド セーフティの問題が確実に発生します。これは、@Scope("prototype") を追加すると、複数のリクエストが HttpServletRequest オブジェクトを共有することを意味します。問題ありません

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:59:04

    スレッドの安全性の問題があるため、この記事を読むことをお勧めします http://www.xuebuyuan.com/1628190.html

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:59:04

    どのクラス インスタンス変数にも潜在的なスレッド セーフティ リスクが存在します。コードでは、インスタンス変数が複数のスレッドで安全であることを確認するか、クラスが同時に 1 つのスレッドのみによってアクセスされることを確認する必要があります。
    あなたの例におけるマルチスレッドの問題は避けられません。Spring チュートリアルに従って、まず物事を正しく理解してから、複雑な問題に進む必要があります。

    返事
    0
  • キャンセル返事