フロント側を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にはアクセスできません'); } }