2012-04-30 12 views
0

サーブレットを使用して簡単なWebアプリケーションを構築しています。私は初心者ですが、この技術の大部分を学ぼうとしました。私が理解できない何かがあります。私のサーブレットの一つは、それがきれいに必要なファイルを含む要求を、GETに応答便利BalusCのFileServletサーブレットが呼び出し元のJSPとセッションを認識させる方法

http://balusc.blogspot.mx/2007/07/fileservlet.html 

です。ゲストと管理者:

は、私は二人のユーザーの種類を持っているDygraph

http://dygraphs.com/ 

用のCSVファイルを提供するために、こののFileServletを使用しています。 CSVファイルをダウンロードすることはできませんが、グラフを見ることは可能です。管理者は両方を実行できるはずです。

fileServletは、URLパターンに応じて:file/*(*はファイル名)として応答し、DygraphはURLで指定されたファイルを読み込むので非常に便利です。

このWebアプリケーションにはloginServletが組み込まれています.Dygraphに指定されているURLをコピーして貼り付けるだけでファイルパスを避けることができます。 FileServletはすでにセッションとloggeduserをそのセッションから取得できますが、GETメソッドを呼び出したページがどのように検出されたかはわかりません。 JSPコード内から呼び出されたときにのみfileservletにファイルを提供し、ブラウザのアドレスバーからは呼び出さないようにします。

私は少し説明しましょう: 「$:私は意味

は、グラフを表示する必要があり、次のJavaScriptコードUSER-ゲストを-as

<div id="graphdiv2" style="width:640px; height:480px;"> 
<script type="text/javascript"> 
g2 = new Dygraph(
document.getElementById("graphdiv2"), 
"${messages.rutacsv}", // path to CSV file 
{ 
rollPeriod: 10, 
showRoller: true 
} 
); 
</script>    
</div> 

変数(のFileServletには、ファイルを提供しています)ファイル/ 2012-04-20_1.csv "

だから、T:{} messages.rutacsv」

このようなもののためにサーブレットによって置き換えられます" Dygraphはファイルをうまく読み込み、線をプロットします。

しかし、ユーザーがContextNameの後にこのURLをコピーしてブロックすると、FileServletが検出できて、Dygraphだけがファイルをダウンロードできるようになります。例えば

、彼のブラウザでは、ユーザがタイプならば:それをダウンロードできないようにする必要があり

http://localhost:8080/MyWebApp/file/2012-04-20_1.csv 

。管理者だけができる必要があります。

今、FileServletを実装して別のURLパターンまたはPOSTメソッドで呼び出す必要があるかもしれないと考えています。単純なユーザーのコピーパスタが「origining-JSP」チェックを通過できないようにします。

私はStruts2で試してみることにしましたが、これはこのアプリケーションではあまりにも複雑です。簡単なサーブレットやJSPを使用して、利便性と開発の容易さのために放棄しました。

+0

サーブレットフィルタは、URLと現在のユーザーロールをチェックし、管理者のみが直接ダウンロードできるようになります。他のリクエストについては、404を返すか、JSPにリダイレクトを送信してください。 –

+0

しかし、私はユーザーの役割を実装しているとは思わない。セッション上でのみsession.setAttribute( "logonuser"、 "username")を実行します。私はその追加の仕事をしなければならないと思います...私はしませんか? –

+0

要件によって異なります。ログインしているユーザーが直接ダウンロードできる場合は、 'logonuser'属性がセッションに存在するかどうかを確認します。そうでない場合はログインサーブレットにリダイレクトします。 –

答えて

2

filterを使用して、ユーザーの役割を確認します。これは、ユーザーがこの操作の権利を持っているかどうかを確認するために重要なアクションが必要になる前です。これは、タスクサーブレットフィルタです。

次のようにjavax.servlet.Filterを拡張するクラスでメソッドdoFilter()を実装する必要があります。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest req = (HttpServletRequest) request; 

    HttpSession session = req.getSession(); 

    String currentRole = (String) session.getAttribute("userRole"); 

    if ("admin".equals(currentRole)) { 
     successRedirect(); 
    } else { 
     failRedirect(); 
    } 
    chain.doFilter(request, response); 
} 

そして、web.xmlファイルの必要なアドレスに、このフィルタをマッピング忘れないでください:

<filter> 
    <filter-name>CheckRightAccessFilter</filter-name> 
    <filter-class>yourproject.CheckRightAccessFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CheckRightAccessFilter</filter-name> 
    <url-pattern>*.csv</url-pattern> 
</filter-mapping> 
+0

それは理にかなっています。私は自分自身でその "タスクの役割"を実装する必要がありますか?最初に実装してからServlet Filterに到達する必要があるようです。私は今セッションのユーザー名を格納しています。そしてFileServletは "admin"という名前であるかどうかを確認します。 –

+0

セッションで変数 'userRole'を設定する必要があります:' session.setAttribute(userRole、 "nameUserRole") '。このアクションは、ユーザーが承認の段階を正常に通過した後に行わなければなりません。だから、受け取った情報によって、どんな役割が彼に割り当てられるべきかはっきりしていた – kapand

+0

さて、今、私はその方法を実装したとしましょう。今度は、 "FileServlet"がURLパターンで直接呼び出されたかどうか、または他のJSPから呼び出されたかどうかを検出できますか? 管理者以外のユーザーがFileServletへの呼び出しをブラウザのアドレスバーにペーストすると、ブロックされるはずです。 –

2

サブミットされたURLをチェックし、セッションオブジェクトに基づいてユーザーロールを識別するサーブレットフィルタを使用します。許可されたユーザーが見つかった場合、ダウンロードページに再送信できます

関連する問題