Spring Boot转换(从jsp加载图像)到(从html加载)

时间:2017-08-14 02:06:26

标签: java spring jsp spring-boot thymeleaf

我有一个使用Strut1框架的旧项目。因此它使用JSP从另一个JSP文件加载验证码图像。源代码如下。

现在,我使用Spring Boot和Thymeleaf布局升级该项目。我不知道如何将其转换为HTML。请看一看并提出想法。

感谢。

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

1 个答案:

答案 0 :(得分:0)

作为一种初步方法:

  1. 在名为login.html的resources / templates文件夹下创建一个文件,并放置与login.jsp中相同的代码。将<img src="captcha.jsp">替换为<img th:src="${capchaUrl}">之类的内容如果这不是整个页面,您还可以创建一个片段并将其包含在您需要的任何位置。
  2. 在模板控制器中,通过重构captcha.jsp添加创建验证码所需的方法,并且一旦有了验证码,就可以将它添加到模型中,如model.addAttribute("capchaUrl", the_generated_captcha);,它应该填充在模板中。 / LI>