2017-08-14 6 views
0

Strut1フレームワークを使用している古いプロジェクトがあります。したがって、JSPを使用して別のJSPファイルからcaptchaイメージをロードします。下のソースコード。Springブート(jspからロードする)から(load from html)

ここでは、Spring BootとThymeleafレイアウトを使用してそのプロジェクトをアップグレードします。私はそれをHTMLに変換する方法を知らない。見て、アイデアを与えてください。

ありがとうございました。 initalのアプローチとして

のlogin.jspについては

<div id="captcha" style="cursor: pointer; height: 30px; width: 150px; display: inline-block; float: left"><img src="captcha.jsp"></div> 

captcha.jsp

<%@ page contentType="text/html;charset=UTF-8"%> 
<%@ page import="java.util.*"%> 
<%@ page import="java.io.*"%> 
<%@ page import="javax.servlet.*"%> 
<%@ page import="javax.servlet.http.*"%> 
<%@ page import="java.awt.*"%> 
<%@ page import="java.awt.image.*"%> 
<%@ page import="javax.imageio.*"%> 
<%@ page import="java.awt.geom.*"%> 
<%@ page import="vn.com.tivn.online.acquiring.util.ValueUtil"%> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>captcha</title> 
</head> 
<body> 

<% 
//======================================================== 
// Kick Ass Captcha JSP 
// 
// Michael Connor 2007 
// 
// I just couldn't handle the thought of downloading a 
// big jar and configuring some servlet.xml and having 
// little to no control of anything... 
// You can send in height and width parameters. 
// The captcha value will be placed in the session in 
// a parameter called 'captcha' 
// 
// Feel free to use this code and do whatever the hell 
// you want to it. 
//======================================================== 

    String imageFormat = "png"; 
    response.setContentType("image/" + imageFormat); 

try { 
    // you can pass in fontSize, width, height via the request 

    Color backgroundColor = Color.blue; 
    Color borderColor = Color.black; 
    Color textColor = Color.white; 
    Color circleColor = new Color(160,160,160); 
    Font textFont = new Font("Arial", Font.PLAIN, paramInt(request, "fontSize", 24)); 
    int charsToPrint = 6; 
    int width = paramInt(request, "width", 150); 
    int height = paramInt(request, "height", 30); 
    int circlesToDraw = 6; 
    float horizMargin = 20.0f; 
    float imageQuality = 0.95f; // max is 1.0 (this is for jpeg) 
    double rotationRange = 0.7; // this is radians 
    BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    Graphics2D g = (Graphics2D) bufferedImage.getGraphics(); 

    g.setColor(backgroundColor); 
    g.fillRect(0, 0, width, height); 

    // lets make some noisey circles 
    g.setColor(circleColor); 
    for (int i = 0; i < circlesToDraw; i++) { 
    int circleRadius = (int) (Math.random() * height/2.0); 
    int circleX = (int) (Math.random() * width - circleRadius); 
    int circleY = (int) (Math.random() * height - circleRadius); 
    g.drawOval(circleX, circleY, circleRadius * 2, circleRadius * 2); 
    } 

    g.setColor(textColor); 
    g.setFont(textFont); 

    FontMetrics fontMetrics = g.getFontMetrics(); 
    int maxAdvance = fontMetrics.getMaxAdvance(); 
    int fontHeight = fontMetrics.getHeight(); 

    // i removed 1 and l and i because there are confusing to users... 
    // Z, z, and N also get confusing when rotated 
    // 0, O, and o are also confusing... 
    // lowercase G looks a lot like a 9 so i killed it 
    // this should ideally be done for every language... 
    // i like controlling the characters though because it helps prevent confusion 
    String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy23456789"; 
    char[] chars = elegibleChars.toCharArray(); 

    float spaceForLetters = -horizMargin * 2 + width; 
    float spacePerChar = spaceForLetters/(charsToPrint - 1.0f); 

    AffineTransform transform = g.getTransform(); 

    StringBuffer finalString = new StringBuffer(); 

    for (int i = 0; i < charsToPrint; i++) { 
    double randomValue = Math.random(); 
    int randomIndex = (int) Math.round(randomValue * (chars.length - 1)); 
    char characterToShow = chars[randomIndex]; 
    finalString.append(characterToShow); 

    // this is a separate canvas used for the character so that 
    // we can rotate it independently 
    int charImageWidth = maxAdvance * 2; 
    int charImageHeight = fontHeight * 2; 
    int charWidth = fontMetrics.charWidth(characterToShow); 
    int charDim = Math.max(maxAdvance, fontHeight); 
    int halfCharDim = (int) (charDim/2); 

    BufferedImage charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D charGraphics = charImage.createGraphics(); 
    charGraphics.translate(halfCharDim, halfCharDim); 
    double angle = (Math.random() - 0.5) * rotationRange; 
    charGraphics.transform(AffineTransform.getRotateInstance(angle)); 
    charGraphics.translate(-halfCharDim,-halfCharDim); 
    charGraphics.setColor(textColor); 
    charGraphics.setFont(textFont); 

    int charX = (int) (0.5 * charDim - 0.5 * charWidth); 
    charGraphics.drawString("" + characterToShow, charX, 
          (int) ((charDim - fontMetrics.getAscent()) 
           /2 + fontMetrics.getAscent())); 

    float x = horizMargin + spacePerChar * (i) - charDim/2.0f; 
    int y = (int) ((height - charDim)/2); 
//System.out.println("x=" + x + " height=" + height + " charDim=" + charDim + " y=" + y + " advance=" + maxAdvance + " fontHeight=" + fontHeight + " ascent=" + fontMetrics.getAscent()); 
    g.drawImage(charImage, (int) x, y, charDim, charDim, null, null); 

    charGraphics.dispose(); 
    } 

    // let's do the border 
    g.setColor(borderColor); 
    g.drawRect(0, 0, width - 1, height - 1); 

    //Write the image as a jpg 
    Iterator iter = ImageIO.getImageWritersByFormatName(imageFormat); 
    if(iter.hasNext()) { 
    ImageWriter writer = (ImageWriter)iter.next(); 
    ImageWriteParam iwp = writer.getDefaultWriteParam(); 
    if (imageFormat.equalsIgnoreCase("jpg") || imageFormat.equalsIgnoreCase("jpeg")) { 
     iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
     iwp.setCompressionQuality(imageQuality); 
    } 
    writer.setOutput(ImageIO.createImageOutputStream(response.getOutputStream())); 
    IIOImage imageIO = new IIOImage(bufferedImage, null, null); 
    writer.write(null, imageIO, iwp); 
    } else { 
    throw new RuntimeException("no encoder found for jsp"); 
    } 

    // let's stick the final string in the session 
    request.getSession().setAttribute("wirecardmposcaptcha", finalString.toString()); 
System.out.print("----------"+g.dispose()); 
    g.dispose(); 

} catch (IOException ioe) { 
    throw new RuntimeException("Unable to build image" , ioe); 
} 

%> 

<%! 
    public static String paramString(HttpServletRequest request, String paramName, String defaultString) { 
    return request.getParameter(paramName) != null ? request.getParameter(paramName) : defaultString; 
    } 

    public static int paramInt(HttpServletRequest request, String paramName, int defaultInt) { 
    return request.getParameter(paramName) != null ? Integer.parseInt(request.getParameter(paramName)) : defaultInt; 
    } 

%> 


<% 
    if(ValueUtil.SUPPORT_SSL){ 
     String sessionid = request.getSession().getId(); 
     response.addHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; Secure; HttpOnly"); 
    } 
%> 


</body> 
</html> 

答えて

0

  1. ログインと呼ばれるリソース/ templatesフォルダの下にファイルを作成します。 .htmlとlogin.jsと同じコードを配置しますp。 <img src="captcha.jsp"><img th:src="${capchaUrl}">のように置き換えます。これがページ全体でない場合は、フラグメントを作成して必要な場所に含めることもできます。
  2. テンプレートコントローラでは、captchaをリファクタリングしてキャプチャを作成するために必要なメソッドを追加し、キャプチャを取得したらmodel.addAttribute("capchaUrl", the_generated_captcha);のようなモデルに追加することができます。
+0

ありがとうございました。 –

関連する問題