JavaWeb项目运行期间验证码不显示解决方案

前言

  • 场景描述

    线上项目部署在Tomcat容器上,刚启动时验证码正常显示,运行一段时间后,验证码无法显示,查看日志发现打印堆内存溢出

    
    
        java.lang.OutOfMemoryError: Java heap space
    
    
    

解决思路

  • 解决步骤

    1. 使用jdk安装目录下bin目录自带的jvisualvm查看内存使用情况。

    2. 使用jprofiler分析。

    3. 查看Linux服务器内存使用情况。

      
          free -h
      
      
      
      
    4. 对Tomcat进行调优

解决过程

手动设置Heap Size大小

```sh

    # Windows下修改 TOMCAT_HOME/bin/catalina.bat
    ## 在“echo Using CATALINA_BASE:   "%CATALINA_BASE%"”上面加入以下行:
    set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m   -XX:MaxNewSize=256m
        
    # Linux下修改 TOMCAT_HOME/bin/catalina.sh
    ## 在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
    JAVA_OPTS="$JAVA_OPTS  -server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"
    ## 或
    JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"


    # 替换后catalina.sh后,启动startup.sh失败
    
    # 在tomcat的bin目录下执行指令:chmod +x *.sh,然后再次启动



```

-Djava.awt.headless=true

  • 第二天项目验证码再次显示失败

    查看tomcat目录logs目录下localhost.2019-04-30.log日志发现生成验证码的servlet报错

    
        严重: Servlet.service() for servlet generateCode threw exception
        java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
    
    
  • 修改Heap Size配置

    
    
    
        # Linux下修改 TOMCAT_HOME/bin/catalina.sh
        ## 方案一
                exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
                  -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
                  -Dcatalina.base="$CATALINA_BASE" \
                  -Dcatalina.home="$CATALINA_HOME" \
                  -Djava.io.tmpdir="$CATALINA_TMPDIR" \
        ### 在尾部加上一句:
                  -Djava.awt.headless=true \
                  
        ### 启动时报异常:http://www.cnblogs.com/aigongsi/archive/2012/04/11/2442774.html
                  
        ## 方案二
        ### 在首行加上(保留之前配置)
        
            JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m  -Djava.awt.headless=true"
            
        ### 正常启动
    
    

参考链接

  • 待更新

    https://www.cnblogs.com/zzblee/p/4038370.html

  • 关于Eclipse中一个错误排查总结

    http://www.cnblogs.com/aigongsi/archive/2012/04/11/2442774.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现图片验证码主要需要以下几个步骤: 1. 生成随机字符串:使用 Java 的随机数生成器生成指定长度的随机字符串,可以使用 UUID、SecureRandom等类实现。 2. 将随机字符串绘制到图片上:使用 Java 的 Graphics2D 类将随机字符串绘制到一个 BufferedImage 对象上,可以设置字体、字号、颜色等参数。 3. 添加干扰元素:为了防止机器识别验证码,需要在图片上添加干扰元素,例如噪点、曲线等。 4. 输出图片:使用 Java 的 ImageIO 类将 BufferedImage 对象输出为图片文件或者直接输出到响应流中。 以下是一个简单的示例代码: ```java public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应类型为图片 response.setContentType("image/jpeg"); // 生成随机字符串 String code = generateCode(); // 将随机字符串绘制到图片上 BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, 100, 30); g.setColor(Color.BLACK); g.setFont(new Font("Arial", Font.BOLD, 20)); g.drawString(code, 10, 20); // 添加干扰元素 Random random = new Random(); for (int i = 0; i < 20; i++) { int x = random.nextInt(100); int y = random.nextInt(30); g.drawOval(x, y, 1, 1); } // 输出图片 ImageIO.write(image, "JPEG", response.getOutputStream()); } private String generateCode() { StringBuilder builder = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 6; i++) { int code = random.nextInt(10) + 48; // ASCII码值范围:48-57 builder.append((char) code); } return builder.toString(); } ``` 在 Servlet 中调用 doGet 方法即可生成图片验证码,可以在 HTML 表单中添加一个图片标签,设置 src 属性为 Servlet 的 URL,然后用户在提交表单时同时提交验证码,进行验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值