0

サーブレットを使用して単純な WebApplication を構築しています。私は初心者ですが、この技術を最大限に学ぼうとしました。解せないものがあります。私のサーブレットの 1 つは便利な BalusC FileServlet です。

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

GET 要求に応答して、必要なファイルをきれいに取得します。

この FileServlet を使用して、Dygraph の CSV ファイルを提供します

http://dygraphs.com/

ゲストと管理者の 2 種類のユーザーがいます。ゲストはグラフを表示できますが、CSV ファイルをダウンロードすることはできません。管理者は両方を実行できる必要があります。

fileServlet は URL パターンに次のように応答します: file/* (* はファイル名)。Dygraph は URL で指定されたファイルを読み取るため、非常に便利です。

この webapp 内に構築された loginServlet があり、ユーザーが Dygraph に指定された URL をコピーして貼り付けるだけで、fileservlet がファイルを提供するのを回避できるようにしたいと考えています。FileServlet はすでにセッションとそのセッションからのログユーザーを取得できますが、GET メソッドを呼び出したページを検出する方法がわかりません。ブラウザーのアドレス バーからではなく、JSP コード内から呼び出された場合にのみ、fileservlet がファイルを提供するようにします。

少し説明させてください:

つまり、ゲストユーザーとして、次のJavascriptコードはグラフを表示する必要があります(FileServletがファイルを提供します)

<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>

変数: "${messages.rutacsv}" は、次のようなサーブレットに置き換えられます。

「ファイル/2012-04-20_1.csv」

したがって、Dygraph はファイルを適切に読み込み、線をプロットします。

しかし、ユーザーが ContextName の後にこの URL をコピーペーストしてブロックしたことを FileServlet が検出できるようにして、Dygraph のみがファイルをダウンロードできるようにしたいと考えています。

たとえば、ユーザーがブラウザに次のように入力したとします。

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

ダウンロードできないはずです。管理者のみができる必要があります。

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

ところで、私は Struts2 を試してから戻ってきましたが、これはこのアプリケーションには複雑すぎます。シンプルなサーブレットと JSP を使用した開発の利便性と容易さのために、私はそれを放棄しました。

4

2 に答える 2

2

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

于 2012-06-21T10:44:18.460 に答える
2

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

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

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>
于 2012-04-30T01:17:39.230 に答える