web-dev-qa-db-ja.com

Spring MVCでリダイレクト中にモデル属性を渡し、URLで同じことを回避する

私は春の初心者です
stackoverflowでWebおよび関連する投稿も検索しました。実際に必要なものが見つかりませんでした。
私の目的は、リダイレクト時にモデル属性をコントローラーからjspページに渡し、属性がURLに表示されないようにすることです。
以下は、jdoを使用してデータストアからのログインを検証しています。

私のコントローラー:

@Controller
public class LoginController {
    int count;
    PersistenceManager pm = PMF.get().getPersistenceManager();

    //Instance of data class
        User user;
    ModelAndView modelAndView=new ModelAndView();

    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public ModelAndView loginValidate(HttpServletRequest req){

        //Getting login values
        String uname=req.getParameter("nameLogin");
        String pswd1=req.getParameter("pswdLogin");
        count=0;


        user=new User();

        //Generating Query
        Query q = pm.newQuery(User.class);
        q.setFilter("userName == userNameParam");
        q.declareParameters("String userNameParam");

        try{
            List<User> results = (List<User>) q.execute(uname);  
            for (User u: results) {

                String userName=u.getUserName();

                if(userName.equals(uname)){

                    System.out.println(u.getPassword());

                    if(u.getPassword().equals(pswd1)){
                        count=count+1;
                        modelAndView.setViewName("redirect:welcome");
                        modelAndView.addObject("USERNAME",uname);
                        return modelAndView;

                    }
         //rest of the logic 
    }

JSP:

 <h1>Welcome ${USERNAME} </h1>

私のURLは/welcome?USERNAME=robin
私の目的は/welcome
また、私のページには「Welcome robin」と表示されるはずですが、「Welcome」のみが表示されます。解決方法を教えてください。
前もって感謝します!

22
Chandni

Spring MVCのflash属性機能を使用する必要があります。リダイレクト後にデータにアクセスできるようにする場合は、モデル(ModelModelMapまたはModelAndView)ではなく、RedirectAttributesに追加しますコントローラーメソッドのパラメーターとして取得します。

@RequestMapping(value="/Login",method = RequestMethod.POST)
public ModelAndView loginValidate(HttpServletRequest req, RedirectAttributes redir){
...

    modelAndView.setViewName("redirect:welcome");
    redir.addFlashAttribute("USERNAME",uname);
    return modelAndView;
}

これらのflash属性は、セッションを介して渡されます(使用後すぐに破棄されます-詳細については、Spring Reference Manualを参照してください)。これには2つの関心があります。

  • uRLには表示されません
  • 文字列に制限されませんが、任意のオブジェクトを渡すことができます。
58
Serge Ballesta

あなたがしようとしていることは正当な理由でサポートされていないので、ここで注意する必要があります。 "redirect"ディレクティブは、コントローラーに[〜#〜] get [〜#〜]リクエストを発行します。 [〜#〜] get [〜#〜]リクエストは、リクエストパラメータを使用して既存の状態のみを取得する必要があります。これはメソッドコントラクトです。それ[〜#〜] get [〜#〜]リクエストすべきではない以前の対話、またはその結果としてセッション内のどこかに保存されているオブジェクトに依存する[〜#〜] get [〜#〜]要求は、既存の(永続的な)状態を取得するように設計されています。元の([〜#〜] post [〜#〜])リクエストは、あなたに必要なものをすべて保持しているはずです[〜#〜] get [〜#〜]リクエスト状態を取得します。

RedirectAttributesは、この場合あなたをサポートするようには設計されていません。正しく使用できたとしても、一度しか動作せず、その後破棄されます。その後、ブラウザを更新すると、属性が見つからなくなるため、アプリケーションエラーが発生します。

4
DhafirNz

リダイレクトを使用して送信されるすべてのオブジェクトは、コントローラからURL自体に渡すことができます-

String message = "Hi Hello etc etc"
return new ModelAndView("redirect:" + "welcome", "message", message);

このメッセージ変数は、GETリクエストとしてURLで利用できます-

http://localhost:8080/Demo/welcome?message=Hi Hello etc etc

スクリプトレットを介してJSPの変数にアクセスできるようになりました-

<%= request.getParameter("message") %>
1
devutkarsh