栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

${pageContext.request.contextPath}访问不到,验证码刷新失败

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

${pageContext.request.contextPath}访问不到,验证码刷新失败

背景:

原本想写一个验证码图片,但是写好之后,在前端就是拿不到图片,路径也没啥错误。项目结构如下:

Maven配置如下:

  
    verificationImage
    com.ljh.servlet.VerificationImage
  
  
    verificationImage
    /vg
  

前端代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*"%>


验证码: 换一张 看不清楚换一张

诶,结果他就这样,

刚开始,以为路径有问题,就直接访问一把生成验证码图片的 servlet,诶,它成功访问。不是路径问题、、、、、、、

接下来我就好奇,为啥呢?我就把前端加个链接,然后直接点一手看他跳到哪?

给我跳!

好好的地址成乱码了,懂了,就是没解析到写的地址呗?为啥没解析呢?拿着错误查了一下,知道问题在哪了。

问题1(${pageContext.request.contextPath}访问不到)原因:
${} 没有解析出来。
<%@ page isELIgnored="true|false"%>如果设定为真,那么JSP中的表达式被当成字符串处理,
我们通过字面意思理解一下:是否忽略el表达式,如果为true就是忽略el表达式,就是当做字符串来处理;
反之,就是按el表达式来。
解决方案:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>

后续

本以为就好了,谁知道还有问题,就是狂点看不清,换一张,但是这图片就是不换,咋回事呢:
尝试点刷新,诶,能换,那就是script那段写的有问题。左思右想。难道是点完没执行changeImg()函数吗?尝试修改然后加上两句话,看看到底有没有执行。

function changeImg(){
        alert("我执行了");
        document.getElementById("validateCodeImg").src="${pageContext.request.contextPath}/vg";
        alert("我也执行了");
    }



都执行了。。。。
再思考一下:

1. 拿到validateCodeImg控件
2. 把"${pageContext.request.contextPath}/vg"赋值给该控件的validateCodeImg
3. 没啥问题呀,啊不对,仔细一想,原本上面的在表单里的src初始值是"${pageContext.request.contextPath}/vg"
   那么这一步掉用了"changeImg()"函数,把值改成"${pageContext.request.contextPath}/vg",认为
   src相当于重新访问了一遍servlet,得到个新的图像,但是实际根本没有刷新src,因为第一次请求到
   "${pageContext.request.contextPath}/vg"之后,这个值一直都在,所以计算调用"changeImg()",相当于
   把这个值又给src赋值了一遍,没什么意义的操作。
4. 那么想解决,就需要保证当调用"changeImg()"时候,会重新访问一边"${pageContext.request.contextPath}/vg",
   怎么做呢? 
   document.getElementById("validateCodeImg").src="${pageContext.request.contextPath}/vg?"+Math.random();
问题2(验证码刷新失败)原因:

这样validateCodeImg控件的src并不会重新访问一边${pageContext.request.contextPath}/vg,而是将上次访问
${pageContext.request.contextPath}/vg的值,重新又给了src,那么验证码图片将不会刷新。

document.getElementById("validateCodeImg").src="${pageContext.request.contextPath}/vg"
解决方案:

终于好了,nice。

生成验证码的servlet:

没加线条和噪声点 (o。o)

//VerificationImage.java

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class VerificationImage extends HttpServlet {
    private final int WIDTH =  160;
    private final int HEIGHT = 40;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
//        resp.setHeader("refresh","5");
        Random random = new Random();

        //在内存中生成一个画布
        BufferedImage bufferedImage = new BufferedImage(WIDTH,HEIGHT,1);
        //可以理解为 拿到画笔
        Graphics graphics = bufferedImage.getGraphics();
        //设置画笔颜色
        graphics.setColor(new Color(197,197,197));
        //用画笔的颜色涂满 规定区域,这里主要是画出背景色
        graphics.fillRect(0,0,WIDTH,HEIGHT);
        //将画笔转为2d
        Graphics2D g2 = (Graphics2D)graphics;
        //设置画笔的字体
        g2.setFont(new Font("宋体",Font.BOLD, 34));
        //生成随机4位数字
        int rdmInt = random.nextInt(9999-1000+1)+1000;
        //将数字存到session
        req.getSession().setAttribute("vgCode",rdmInt+"");
        int num, x = 3;
        while (rdmInt > 0){
            //随机生成一个颜色,用来画出其中一个数字
            //原本random.nextInt(127)可以是RGB的0-255,但这里设置127是怕到时候生成的画笔颜色太靠近255,太亮
            //可能会跟底色一样的颜色,就看不出来了,所以让他颜色暗一点
            g2.setColor(new Color(random.nextInt(127),random.nextInt(127),random.nextInt(127)));
            //除10模10拿到其中一个数字
            num = rdmInt % 10;
            rdmInt = rdmInt / 10;
            //随机生成一个倾斜角
            int degree = random.nextInt() % 30;
            //设置画笔偏向角度
            g2.rotate(degree * Math.PI / 180, x, 34);
            //用画笔画出其中一个数字
            g2.drawString(num+"", x, 34);
            //将画笔调正,防止下次生成角度之前,画笔已经是歪的
            g2.rotate(-degree * Math.PI / 180, x, 34);
            x += 40;
        }

        g2.dispose();
        //设置响应头控制浏览器不缓存
        resp.setDateHeader("expries", -1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        //将图片写给浏览器
        ImageIO.write(bufferedImage,"JPEG",resp.getOutputStream());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/763767.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号