1

私が信じていることは、非常に単純な問題ですが、それを解決しようとする私の試みはすべて失敗しました。

簡単に言うと、Java サーブレットを呼び出すフォームを含む JSP ファイルがあります。サーブレットは入力を処理し、変数 (属性) を返し、同じjsp にリダイレクトします。スクリプトレットではなくJavaScriptを使用して、返された属性を jsp で処理したいと考えています。

JSP コード (test.jsp):

<html>
  ...
  <%@page language="java"
    import="java.sql.*" 
    import="java.util.*"
  %>
  ...
  <body>
    <script type='text/javascript'>
      var name = session.getAttribute("test");
      alert(name);
    </script>
    ...
  </body>
</html>

そしてサーブレットコード:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
  request.getSession().setAttribute("test", "value");
  String redirectedPage = "/test.jsp";
  RequestDispatcher reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher(redirectedPage);
  reqDispatcher.forward(request,response);
}

問題は、セッション変数の宣言に起因すると考えています。

var name = session.getAttribute("test");

私も試しました:

var name = (String) session.getAttribute("bob");

と:

String name = (String) session.getAttribute("bob");

スクリプトレット (<% %>) を使用してフォーム内からこの属性にアクセスできますが、返された属性を変更/処理する必要がありません。

どんな助けでも大歓迎です。この質問がすでに尋ねられている/対処されていると思われる場合は (検索しました)、丁寧にお知らせください。

4

1 に答える 1

4

JavaScript からセッションにアクセスすることはできませんが、サーバー側で JavaScript を作成することはもちろん可能です。

<script type='text/javascript'>
  var name = '<%= session.getAttribute("test") %>';
  alert(name);
</script>

実際の値を 100% 制御できない場合 (そしておそらくその場合でも)、文字列をエスケープすることをお勧めします。そうしないと、誰かがページを破壊する値を挿入したり (最良の場合)、一部の XSS がユーザー データを盗んだり、ユーザー セッションを乗っ取ったりする可能性があります。

Apache commons StringEscapeUtils ( JavaDoc ) を使用すると、次のようになります。

<script type='text/javascript'>
  var name = '<%= StringEscapeUtils.EscapeJavaScript((String)session.getAttribute("test")) %>';
  alert(name);
</script>

これを頻繁に (または 1 回だけでも) 使用する場合は、属性名を取得して JavaScript セーフ文字列を出力するタグを作成することをお勧めします。< MyJsTags :AttributeAsString name="test"/>のように、スクリプトを回避して JSP を許可し、属性にアクセスするときに新しい機能を課したい場合にも簡単になります。

于 2012-12-19T22:44:32.073 に答える