Redirect/Forward


Redirect


クライアントがエラーurlにリクエストを送信すると、ブラウザはリクエストヘッダの位置アドレスを自動的に読み取り、適切なリクエストを送信します.
クライアントからの要求がGetであろうとPostであろうと、ブラウザからの要求はすべてGetである.

Springでのリダイレクトプロセス

@PostMapping("/register/save")
    public String save(User user, Model m) throws Exception{
        if(!isValid(user)){
            String msg = URLEncoder.encode("잘못된 정보입니다", "utf-8");
            m.addAttribute("message", msg);
            return "redirect:/register";
        }
    }
クライアントはregister/saveに要求したが、検証に失敗し、コントローラはビュー名ではなくリダイレクトを返した.
if(!isValid(user)){
            String msg = URLEncoder.encode("잘못된 정보입니다", "utf-8");
            m.addAttribute("message", msg);
            return "redirect:/register";
コントローラがリダイレクトを返すと、DispatcherServiceletはリダイレクトをRedirectViewに転送し、RedirectViewが生成した応答ヘッダの位置アドレスを読み出し、ブラウザは要求を自動的に送信します.

Forward


ユーザが要求した内容をそのまま正しいアドレスに伝達するプロセス.
@PostMapping("/register/save")
    public String save(User user, Model m) throws Exception{
        if(!isValid(user)){
            String msg = URLEncoder.encode("잘못된 정보입니다", "utf-8");
            m.addAttribute("message", msg);
            return "forward:/register";
        }
    }
コントローラは、forwardをDispatcherServiceに渡し、対応するforward文字列をInternalResourceViewに渡します.
InternalResourceViewは、DispatcherServiceletにアドレス(要求)を呼び出すことによって、要求アドレスに接続されたメソッドを呼び出す.したがって、forwardはInternalResourceViewによって処理され、内部で行われるプロセスである.

RedirectとForwardの違い


リダイレクトは要求と応答が2回ずつであり,転送は要求と応答が1回ずつである.