Excelの高速データグリッドとWebサービスとシングルサインオン と(Internet Explorer限定が残念だが・・・)


Internet Explorer限定のアイデアだし、ChromeやMicrosoft Edgeでは動かないので、うーんなのですが、WebサービスのフロントがExcelになるので、手持ちのExcel資産の有効活用ができます。
これまで作ってきたExcel VBAの資産や、手持ちのExcel資料からのコピペ、ExcelマクロでWebサービスから取得したデータでグラフを作図して、それをPDFファイルで保存するとかとかとか・・・。

ただ、肝となる実装でjavascriptでセッションIDをCookieにしまったり、読み出したりする都合、Tomcatの設定の”useHttpOnly”を”false”にしたりと、XSS攻撃対策的にどうなの？！的な実装でもあり、もう一歩なのです・・・。
イントラネット内であればいけるかも。

# 1	動機
Webアプリケーションで高速スクロールが可能なグリッド画面が欲しい。
# 2	制約
①Webフォーム認証が必要。
②何度もユーザIDとパスワードを入力させない。つまりシングルサインオンであること。
③あえて、Javascriptのグリッドライブラリは使わない。
# 3	動機実現アイデア
高速なスクロールが可能なグリッドということで、Excelを利用する。そして、そのExcelのマクロからWebサービスを呼び出す。
## 3.1 さらなる制約
Excelを使うなら、そのExcelの配布はWebからの配布であること。
# 4	動機を実現する上での課題
Excelマクロから"MSXML2.XMLHTTP"を使えばWebサービスを呼び出せる(ググれば結構出てくる)。
しかし、制約の①Webフォーム認証があるため、Webサービス呼び出しにはユーザIDとパスワードが必要になる。
これもopenするときの引数にユーザIDとパスワードをセットして呼び出せば可能。
だが、しかし・・・
制約②のシングルサインオンを実現するには、Webフォーム認証の時に入力した、ユーザIDとパスワードを、Excelマクロに何らかの形で引き継いで、それを利用できなければならないのだが、一体どうすればよいのか？
# 5	課題解決アイデア
全く別件でファイルダウンロードの検証をしているときに気がついたのだが、Content-Dispositionを**inline**にすると、ファイルパスがWebサーバのURLになっていた。ということは、フォーム認証の際に、セッションIDをCookieに保存すれば、Excelマクロも同じセッションIDの下でWebサービスを利用することができるかもしれない？！

下記画面キャプチャの情報のあたりを見ていただけるとわかると思いますが、「```http://localhost・・・```」となっています。 これを見たときにふとひらめいたわけです。
![g1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/76786/941fe642-1769-315f-fa92-160c2404fd0f.jpeg)

ちなみに**attachment**にすると、このようにローカルPCのパスになっている。
 ![g2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/76786/43eb5070-b88b-1e5b-882b-2a3c8f5b6e1c.jpeg)

# 6	実践！
と試してみたら、できた！！(いくつかはまり込んだ結果ではありますが)
## 6.1 はまり込み１：Internet Explorer限定で動作
Internet Explorer限定で動作。Microsoft EdgeやChromeではダメ。動かない。
Content-DispositionをinlineしてもAttachmentにしても、ExcelがローカルPCにダウンロードされてしまい、パスがローカルPCになってしまうので、ダメでした。
## 6.2 はまり込み2:Tomcatバージョン7以降はスクリプト言語でCookieにアクセスするには制約がある
それから、Apache Tomcatがバージョン7以降**“useHttpOnly“**設定が初期状態で **True (有効)** に変更になっているので、JavascriptでセッションIDをCookieに格納して、うんぬんかんぬんしようと考えていたが、デフォルトでは出来ないです。
なので、Tomcatのcontext.xmlに次の記述を入れます。
```xml:context.xml
<Context useHttpOnly="false">
```
ただ、もともとTomcatが**useHttpOnly**のデフォルトを**"true"**にしたのは、セッションIDをスクリプト言語から保護することが目的だったはずです。
これを**"false"**にして、javascriptからセッションIDがアクセスできるようにしてしまうと、せっかくのXSS攻撃対策がなくなってしまいます。


![g3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/76786/75a8275b-fe4a-bf42-cc65-dad8084b214a.jpeg)
## 6.3	はまり込み3:セッションIDをCookieに保存しないと、Excelが同一セッションにならない。
単純にURLがWebサービスになっていればうまくいくと思っていたけれど、そうじゃなかった。
**”JSESSIONID”**をCookieにしまってないと、Webサービスを呼び出しても、ログインが要求されてしまう。
![image](https://qiita-image-store.s3.amazonaws.com/0/76786/b6452dae-8268-484b-0adc-ccc1f73c765f.png)



# 7	稼働イメージキャプチャ
## ```http://localhost:8080/GoldenCat/```を開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/76786/6e457acc-8e2a-1142-df1a-efcae3fa9677.png)
## フォーム認証画面が表示されるので、ユーザID欄にユーザIDを入力し、パスワード欄にパスワードを入力して、ログインボタンをクリックします。
(毎回ユーザIDとパスワードを入力するのが面倒な場合は、その下にある表イメージのところのログインボタンをクリックします)
![image](https://qiita-image-store.s3.amazonaws.com/0/76786/ab5ceba8-240d-8089-907f-33496db39cf3.png)
## Excelを開く画面が表示されるので、**”downloadInlineExcel"**のリンクをクリックします。
このHTMLが開くときに、**”JSESSIONID”**をCookieにしまいます。ここがポイント。こうすることで、ExcelマクロがWebサービス通信するときに、このセッションIDを使うことができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/76786/ee75ce54-47c5-6a75-bee1-51e7971ca293.png)

## 次のダイアログが表示されるので、「開く(O)」ボタンをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/76786/7e3f7bee-acc7-9cb1-555d-961fd4a65beb.png)
## するとExcelが開くので、「Webサービス呼び出し」ボタンをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/76786/9d5e3ca6-4e1a-f3dc-5685-e521c9131f75.png)
## すると、右側のセルにWebサービスの応答が表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/76786/45d11f05-d0e8-71c1-d5d5-03982ec9cd84.png)