@Override
  public String toString() {
    StringBuilder sb = new StringBuilder();

    sb.append("\r\n*****************************************************\r\n");
    sb.append("* Owasp.CsrfGuard Properties\r\n");
    sb.append("*\r\n");
    sb.append(String.format("* Logger: %s\r\n", getLogger().getClass().getName()));
    sb.append(String.format("* NewTokenLandingPage: %s\r\n", getNewTokenLandingPage()));
    sb.append(String.format("* PRNG: %s\r\n", getPrng().getAlgorithm()));
    sb.append(String.format("* SessionKey: %s\r\n", getSessionKey()));
    sb.append(String.format("* TokenLength: %s\r\n", getTokenLength()));
    sb.append(String.format("* TokenName: %s\r\n", getTokenName()));
    sb.append(String.format("* Ajax: %s\r\n", isAjaxEnabled()));
    sb.append(String.format("* Rotate: %s\r\n", isRotateEnabled()));
    sb.append(String.format("* TokenPerPage: %s\r\n", isTokenPerPageEnabled()));

    for (IAction action : actions) {
      sb.append(String.format("* Action: %s\r\n", action.getClass().getName()));

      for (String name : action.getParameterMap().keySet()) {
        String value = action.getParameter(name);

        sb.append(String.format("*\tParameter: %s = %s\r\n", name, value));
      }
    }
    sb.append("*****************************************************\r\n");

    return sb.toString();
  }
  public void writeLandingPage(HttpServletRequest request, HttpServletResponse response)
      throws IOException {
    String landingPage = getNewTokenLandingPage();

    /** default to current page * */
    if (landingPage == null) {
      StringBuilder sb = new StringBuilder();

      sb.append(request.getContextPath());
      sb.append(request.getServletPath());

      landingPage = sb.toString();
    }

    /** create auto posting form * */
    StringBuilder sb = new StringBuilder();

    sb.append("<html>\r\n");
    sb.append("<head>\r\n");
    sb.append("<title>OWASP CSRFGuard Project - New Token Landing Page</title>\r\n");
    sb.append("</head>\r\n");
    sb.append("<body>\r\n");
    sb.append("<script type=\"text/javascript\">\r\n");
    sb.append("var form = document.createElement(\"form\");\r\n");
    sb.append("form.setAttribute(\"method\", \"post\");\r\n");
    sb.append("form.setAttribute(\"action\", \"");
    sb.append(landingPage);
    sb.append("\");\r\n");

    /** only include token if needed * */
    if (isProtectedPage(landingPage)) {
      sb.append("var hiddenField = document.createElement(\"input\");\r\n");
      sb.append("hiddenField.setAttribute(\"type\", \"hidden\");\r\n");
      sb.append("hiddenField.setAttribute(\"name\", \"");
      sb.append(getTokenName());
      sb.append("\");\r\n");
      sb.append("hiddenField.setAttribute(\"value\", \"");
      sb.append(getTokenValue(request, landingPage));
      sb.append("\");\r\n");
      sb.append("form.appendChild(hiddenField);\r\n");
    }

    sb.append("document.body.appendChild(form);\r\n");
    sb.append("form.submit();\r\n");
    sb.append("</script>\r\n");
    sb.append("</body>\r\n");
    sb.append("</html>\r\n");

    String code = sb.toString();

    /** setup headers * */
    response.setContentType("text/html");
    response.setContentLength(code.length());

    /** write auto posting form * */
    OutputStream output = null;
    PrintWriter writer = null;

    try {
      output = response.getOutputStream();
      writer = new PrintWriter(output);

      writer.write(code);
      writer.flush();
    } finally {
      Writers.close(writer);
      Streams.close(output);
    }
  }