kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成@自動生成ツール作成中

7:58
①昨日は、サーバーにあるファイルをFlutterでWEB画面に表示しようと思って作った、「ファイを開く」ボタンをやっていた。が、結果うまくいかなかった。

現象:はっきりしたことはわからないが、2種類のWEBビュー(webview_flutter.dart、url_launcher.dart)を試したが、どちらもSpring側のSpringSecurityで認証エラーになっている。
 ・Spring側「/upload」フォルダはADMINしか見れなくしてあるので、セッション情報(JSESSIONID)とCSRF(X-XSRF-TOKENと、XSRF-TOKEN)をヘッダー情報に載せて、渡したのだけど、FlutterのWEBビューは、最初に開くときFlutter画面とは違うセッションとしてあつかわれていると思われて、ヘッダー情報のを見てくれないみたいだ。
 ・FlutterのWEB画面表示は、多分、認証なしのWEB表示のとき使うのだと思う。

結果:どうするかは、まだだけど、Spring側のSpringSecurityの認証がかかっているWEB画面を表示するのに、「webview_flutter.dart」、「url_launcher.dart」は使えないということが分かった。

■「ファイを開く」ボタン

■うまくファイルが表示されなかった画面。2種類のWEBビューともに、
 Spring側のSpringSecurityで認証エラーになっている。

■渡したヘッダー情報の例

headers = {_InternalLinkedHashMap} size = 3
 0 = {map entry} "content-type" -> "application/pdf"
 1 = {map entry} "cookie" -> "fromFlutter=fromFlutter;XSRF-TOKEN=e0bcc931-2549-4bfa-a0ac-3fa4bdff2531;Path=/;JSESSIONID=0661F42E3D..."
 2 = {map entry} "X-XSRF-TOKEN" -> "e0bcc931-2549-4bfa-a0ac-3fa4bdff2531"

■ダメだった例1個目。webview_flutter.dartでやってみたが、NG。

   body: WebView(
        // initialUrl: 'https://flutter.dev',
        // initialUrl: 'http://192.168.1.13:8080/upload/item/A2206040002/item28.pdf',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewController webViewController) async {
          Map<String, String> headers2 = {};
          headers2["content-type"] = "application/pdf";
          headers2["cookie"] = widget.headers["cookie"] ?? "";
          String str = widget.headers["X-XSRF-TOKEN"] ?? "";
          headers2["X-XSRF-TOKEN"] = str;
          var str2 = Uint8List.fromList(("_csrf=" + str).codeUnits);
          final WebViewRequest request = WebViewRequest(
            uri: Uri.parse('http://192.168.1.13:8080/upload/item/A2206040002/item28.pdf'),
            method: WebViewRequestMethod.post,
            headers: headers2,
            // body: Uint8List.fromList('Test Body'.codeUnits),
            body: str2,
          );
          await webViewController.loadRequest(request);
          _controller.complete(webViewController);
        },

■ダメだった例2個目。url_launcher.dartでやってみたが、NG。

            Container(
              margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
              padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),
              child: ElevatedButton(
                onPressed: (){
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (context) =>
                          DoPost(url: Consts.myHttpUrl + '/upload/item/' +  element['item01'] +  '/' + element["item28"],
                              username: widget.username,
                              headers: widget.headers,
                              cookies: widget.cookies,
                              cookieManager: null),
                    ),
                  );
                },
                style: ElevatedButton.styleFrom(
                  primary: Colors.blue,
                ),
                child: const Text("ファイルを開く"),
              ),
            ),
・・・
  static Future<void> launchInWebViewOrVC(BuildContext context, String urlStr, Map<String, String> headers) async {
    final url = Uri.parse(urlStr);
    if (!await launchUrl(
        url,
        mode: LaunchMode.inAppWebView,
        webViewConfiguration: WebViewConfiguration(headers: headers)
       )) {
      openDialogOkComm(context, 'このURLにはアクセスできません');
    }
  }