これが状況です。
バックエンドのspringbootインターフェースは、shiro権限で管理されます。パスワードを覚えておき、ログインしてから24時間以内に自動的にログインしたい。Shiroは、rememberMeのremember password managerを提供して、自動ログインの実現を支援します。
最初に最初のピットについて話させてください。クロスドメイン、これは言うまでもありません。これは特別なピットではありません。以下の構成に従ってください。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CustomCORSConfiguration {
private CorsConfiguration buildConfig(){
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*"); // 允许任何的head头部
corsConfiguration.addAllowedOrigin("*"); // 允许任何域名使用
corsConfiguration.addAllowedMethod("*"); // 允许任何的请求方法
corsConfiguration.setAllowCredentials(true);
return corsConfiguration;
}
// 添加CorsFilter拦截器,对任意的请求使用
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
}
最初のピットの他に、これは巨大なピットです。クッキーの携帯をリクエストする
パスワードマネージャーを記憶するためにShiroConfigにCookieRememberMeManagerを挿入しました。このプロセスでは、記憶パスワードマネージャーがrememberMeという名前のCookieを作成し、このCookieのmaxAgeを1日に設定すると同時に、新しいUsernamePasswordToken(username、 password、true)、自動的にtrueにログインするかどうかという3番目のパラメーターを変更します。過去のlayuiの使用の緊急性に応じて、ログイン後、システムはフロントエンドに2つのパラメーターを作成します。1つはJSESSIONIDと呼ばれ、もう1つはrememberMeと呼ばれます。次のように:
しかし、私のvueログインインターフェイスに正常にログインした後、
次の問題が発生しました。
1:これらの2つのパラメーターはCookieに含まれていません。
2:同時に、認証認証を実行する場合、システムはShiroRealmのログイン認証インターフェイスのみを使用し、認証認証インターフェイスは使用しません。WTF?(長い間検索した後、理由を見つけるにはあまりにも怒っています)
3:Googleの開発者デバッグモードのネットワークを開き、リクエストにCookieがないことを確認します(これが最もひどいポイントです)。
それで、その理由は何ですか。
Axiosリクエストは、デフォルトではCookieを伝送しません。手動でオンにする必要があります。属性withCredentialsをtrueに設定するだけです。1つの属性で3つの問題が解決されます。次のように
(さらに、写真では、axiosがリクエストヘッダーをインターセプトし、Authorizationという名前のヘッダーを設定しました。これはshiroとは関係ありません。これがswaggerでトークンインターセプト検証を設定する方法です。これは前のswaggerで説明されているようです-関連ブログ)
3番目のピットについて話しましょう。x-www-form-urlencoded形式でデータを転送する
上の写真では、インターセプターにcontent-type: 'application / json'を設定しています。
しかし、それは実際には役割を果たしていませんでした。このインターセプターでcontent-typeを削除した後も、リクエストはデフォルトのjson形式のままです。
もちろん、リクエストの大部分はjson形式であり、問題はありませんが、@ ModelAttributeアノテーションでバインドされたパラメーターを持つpostインターフェイスのバックエンドがあります。デフォルトのjson形式では、このパラメーターを取得できません。現時点では、リクエストリクエストの形式をapplication / x-www-form-urlencodedに変更する必要があります。
ただし、これを変更する方法は、元々バックグラウンドに渡される予定だったパラメータオブジェクトproductを、新しいURLSearchParams(product)でデータにラップすることです。