コントローラーからHttpRequestにアクセスするSpring 3 MVC


104

@SessionAttributesたとえばcookie処理のログインのために、それをspring に任せるのではなく、自分でリクエスト属性とセッション属性を処理したいと思います。

HttpRequestコントローラー内からにアクセスする方法がわからないので、上のレイヤーに移動し@RequestAttributeHttpRequestそれ自体にアクセスする方法が必要です。Stripesでは、ApplicationContextとを実装してこれを行うために使用されていましたgetAttribute()

また、HttpServletRequestasパラメータを渡しても機能していないようです。

@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println(""+request.getSession().getCreationTime());
    return "home"; 
}

上記の方法では何も印刷されません。

これについて何かアドバイスはありますか?

回答:


184

Spring MVCは、コントローラーメソッドシグネチャに追加するだけでHttpRequestを提供します。

例えば:

/**
 * Generate a PDF report...
 */
@RequestMapping(value = "/report/{objectId}", method = RequestMethod.GET)
public @ResponseBody void generateReport(
        @PathVariable("objectId") Long objectId, 
        HttpServletRequest request, 
        HttpServletResponse response) {

    // ...
    // Here you can use the request and response objects like:
    // response.setContentType("application/pdf");
    // response.getOutputStream().write(...);

}

ご覧のように、HttpServletRequestHttpServletResponseオブジェクトをシグネチャに追加するだけで、Spring MVCはそれらのオブジェクトをコントローラーメソッドに渡します。HttpSessionオブジェクトも必要になります。

編集:HttpServletRequest / ResponseがSpring 3の一部のユーザーに対して機能していないようです。EduardoZolaが指摘したように、Spring WebRequest / WebResponseオブジェクトを使用してみてください。

Spring MVCがハンドラーメソッドに自動的に注入できるサポートされている引数リストを確認することを強くお勧めします。


こんにちは、ヒントのthx、私は何が間違っているのかわかりませんが、これは機能していません。何も出力されません:@RequestMapping(value = "/")public String home(HttpServletRequest request){System.out。 println( "" + request.getSession()。getCreationTime()); 帰宅"; これは現在の量pofミリ秒を要求するはずですが、それはしません、また@RequestBodyでメソッドに注釈を付けても何も変更しません、さらにアドバイスはありますか?thx for this
JBoy

2
Spring MVCでサポートされている引数へのリンクを@jjmontesに感謝します!
バレット

私は春についてほとんど何も知りませんが、@Contextそれらを注入させるために引数の前に注釈を追加する必要がありました。何か新しいものかもしれません、私は知りませんが、私はそれについて言及したいと思いました。
ivarni

81

私はそれが古い質問であることを知っていますが...

クラスでこれを使用することもできます。

@Autowired
private HttpServletRequest context;

これHttpServletRequestにより、メソッドで使用するの現在のインスタンスが提供されます。


7
この方法でこれを行うと、コントローラーBeanがシングルトンにならないようになりますか?
jjmontes 2013年

2
Springコントローラーは常にシングルトンです。
Deividi Cavarzan 2013年

16
これは間違っていると感じます-コントローラーが特定の時間に複数のリクエストを処理している場合はどうなりますか?では、「現在の」要求とは何でしょうか。
sbk 2014年

2
この質問はのために求めているあなたに関するいくつかの説明がありますstackoverflow.com/questions/17235794/...
Deividi Cavarzan

1
非常に並行性の高い環境で実行された場合でも、常に正しいリクエストを返すgetThreadLocalRequest()GWTのようなものがあると非常に便利ですRemoteServiceServlet
Yuriy Nakonechnyy 2014

0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.