美文网首页
自定义标签JSTL标签库

自定义标签JSTL标签库

作者: 丫甘九 | 来源:发表于2019-04-18 22:11 被阅读0次

生成图片(VerfiyCode类)

import org.junit.Test;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*动态生成图片*/
public class Image {
    @Test
    public void fun1() throws FileNotFoundException, IOException {
        /*创建图片缓冲区;
        * 设置其宽高;
        * 得到这个图片的绘制环境;
        * 保存起来;*/
        BufferedImage bi = new BufferedImage(70,35,BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) bi.getGraphics();/*得到绘制环境*/
        g.setColor(Color.white);/*把环境设置成白色*/
        g.fillRect(0,0,70,35);/*填充矩形,从0,0点开始,宽70,高30,即整个图片,即为设置环境背景色*/
        g.setColor(Color.RED);/*把环境设置为白色*/
        g.drawString("hello",2,35-2);/*向图片上写入字符串,其中2,33表示x.y轴坐标*/
        ImageIO.write(bi,"JHDF",new FileOutputStream("G:/xxx.jpg"));
    }
    @Test
    public void fun2() throws FileNotFoundException, IOException{
        VerifyCode vc = new VerifyCode();
        BufferedImage bi = vc.getImage();
        VerifyCode.output(bi,new FileOutputStream("G:/sss.jpg"));
        System.out.println(vc.getText());

    }

}

package baoming;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

public class VerifyCode {

    private int w = 70;
    private int h = 35;

    private Random r = new Random();
    // 定义有那些字体
    private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
    // 定义有那些验证码的随机字符
    private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
    // 生成背景色
    private Color bgColor = new Color(250, 250, 250);
    // 用于gettext 方法 获得生成的验证码文本
    private String text;

    // 生成随机颜色
    private Color randomColor() {
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red, green, blue);
    }

    // 生成随机字体
    private Font randomFont() {
        int index = r.nextInt(fontNames.length);
        String fontName = fontNames[index];
        int style = r.nextInt(4);
        int size = r.nextInt(5) + 24;

        return new Font(fontName, style, size);
    }

    // 画干扰线
    private void drawLine(BufferedImage image) {
        int num = 3;
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        for (int i = 0; i < num; i++) {
            int x1 = r.nextInt(w);
            int y1 = r.nextInt(h);
            int x2 = r.nextInt(w);
            int y2 = r.nextInt(h);
            g2.setStroke(new BasicStroke(1.5F));// 不知道
            g2.setColor(Color.blue);
            g2.drawLine(x1, y1, x2, y2);
        }
    }

    // 得到codes的长度内的随机数 并使用charAt 取得随机数位置上的codes中的字符
    private char randomChar() {
        int index = r.nextInt(codes.length());
        return codes.charAt(index);
    }

    // 创建一张验证码的图片
    public BufferedImage getImage() {
        BufferedImage image = new BufferedImage(w, h,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        StringBuilder sb = new StringBuilder();
        // 向图中画四个字符
        for (int i = 0; i < 4; i++) {
            String s = randomChar() + "";
            sb.append(s);
            float x = i * 1.0F * w / 4;
            g2.setFont(randomFont());
            g2.setColor(randomColor());
            g2.drawString(s, x, h - 5);

        }
        this.text = sb.toString();
        drawLine(image);

        // 返回图片
        return image;

    }

    // 得到验证码的文本 后面是用来和用户输入的验证码 检测用
    public String getText() {
        return text;
    }

    // 定义输出的对象和输出的方向
    public static void output(BufferedImage bi, OutputStream fos)
            throws FileNotFoundException, IOException {
        ImageIO.write(bi, "JPEG", fos);
    }
}
image.png

登录功能之添加验证码

image.png
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
  String path = request.getContextPath();
  String basepath = request.getScheme()+":"+"//"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<script type="text/javascript">
function _change() {
  /*得到img元素
  * 修改其src为/day11_2/VerifyCodeServlet*/
  var imgEle = document.getElementById("img");
  imgEle.src = "/day11_2/VerifyCodeServlet?a="+new Date().getTime();
  
}
</script>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1>登录</h1>
  <%
  /*读取名为uname的Cookie
  * 如果为空,显示“”
  * 如果不为空,显示它的值*/
  String uname = "";
  Cookie[] cs = request.getCookies();//获取请求中的所有Cookie
  if(cs!=null){//如果存在Cookie
    for(Cookie c : cs){//循环遍历所有的Cookie
      if("uname".equals(c.getName())){//查找名为uname的Cookie
        uname = c.getValue();//获取这个Cookie的值,给uname这个变量
      }

    }
  }
  %>
  <%
    String message = "";
  String msg = (String)request.getAttribute("msg");//获取request域中名为msg的属性
  if(msg!=null){
    message=msg;
  }
  %>
  <font color="red"></font>
  <form action="/day11_2_war_exploded/LoginServlet" method="post"><%=message%>
  <%--把Cookie中的用户名显示到用户名文本框中--%>
  用户名:<input type="text" name="username" value="<%=uname%>"><br/>
  密  码:<input type="text" name="password"><br/>
    验证码:<input type="text" name="verifyCode" size="3"/>
    <img id="img" src="VerifyCodeServlet">
    <a href="javascript:_change">换一张</a>
    </br>
  <input type="submit" value="登录">
  </form>
  </body>
</html>

package baoming;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(name = "LoginServlet",urlPatterns = "{/day11_2_war_exploded/LoginServlet}")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*校验验证码
        * 1、从session中获取正确的验证码
        * 2、从表单中获取用户填写的验证码
        * 3、进行比较
        * 4、如果相同,进行比较,否则保存错误信息到request域,转发到login.jsp*/
        String sessionCode = (String) request.getSession().getAttribute("session_vcode");
        String paramCode = request.getParameter("verifyCode");
        if(!paramCode.equalsIgnoreCase(sessionCode)){
         request.setAttribute("msg","验证码错误");
        request.getRequestDispatcher("/login.jsp").forward(request,response);
         return;
        }


        /*1、获取表单信息
        * 处理中文问题
        * 获取*/
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        /*2、校验用户名和密码是否正确*/
        if(!"itcast".equals("username")){//登录成功
            /*附加项:把用户名保存到Cookie中,发送给客户端浏览器
            * 当再次打开login.jsp时,login.jsp会读取request中的Cookie,把它显示到用户名文本框中*/
            Cookie cookie = new Cookie("uname","username");
            cookie.setMaxAge(60*60*24);
            response.addCookie(cookie);
            /*3、如果成功
            * 保存用户信息到session中
            * 重定向到succ1.jsp中*/
            HttpSession session = request.getSession();//获取session,从session类中拿到session
            session.setAttribute("username",username);//向session域中保存用户名
            response.sendRedirect("/day11_2_war_exploded/succ1.jsp");
        }
        else{/*登录失败*/
            /*4、保存失败信息到request域中
            * 转发到login.jsp*/
            request.setAttribute("msg","您输入的用户名或密码有误,请重新输入");//保存失败信息数据到request域中,
            RequestDispatcher qr = request.getRequestDispatcher("/login.jsp");//得到转发器
            qr.forward(request,response);//转发

        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

package baoming;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;

@WebServlet(name = "VerifyCodeServlet")
public class VerifyCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*生成图片
         * 保存图片的文本到session域中
         * 把图片相应给客户端*/
        VerifyCode vc = new VerifyCode();
        BufferedImage image = vc.getImage();
        request.getSession().setAttribute("session",vc.getText());/*保存图片上的文本到session域*/
        VerifyCode.output(image,response.getOutputStream());

    }
}

package baoming;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

public class VerifyCode {

    private int w = 70;
    private int h = 35;

    private Random r = new Random();
    // 定义有那些字体
    private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
    // 定义有那些验证码的随机字符
    private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
    // 生成背景色
    private Color bgColor = new Color(250, 250, 250);
    // 用于gettext 方法 获得生成的验证码文本
    private String text;

    // 生成随机颜色
    private Color randomColor() {
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red, green, blue);
    }

    // 生成随机字体
    private Font randomFont() {
        int index = r.nextInt(fontNames.length);
        String fontName = fontNames[index];
        int style = r.nextInt(4);
        int size = r.nextInt(5) + 24;

        return new Font(fontName, style, size);
    }

    // 画干扰线
    private void drawLine(BufferedImage image) {
        int num = 3;
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        for (int i = 0; i < num; i++) {
            int x1 = r.nextInt(w);
            int y1 = r.nextInt(h);
            int x2 = r.nextInt(w);
            int y2 = r.nextInt(h);
            g2.setStroke(new BasicStroke(1.5F));// 不知道
            g2.setColor(Color.blue);
            g2.drawLine(x1, y1, x2, y2);
        }
    }

    // 得到codes的长度内的随机数 并使用charAt 取得随机数位置上的codes中的字符
    private char randomChar() {
        int index = r.nextInt(codes.length());
        return codes.charAt(index);
    }

    // 创建一张验证码的图片
    public BufferedImage getImage() {
        BufferedImage image = new BufferedImage(w, h,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        StringBuilder sb = new StringBuilder();
        // 向图中画四个字符
        for (int i = 0; i < 4; i++) {
            String s = randomChar() + "";
            sb.append(s);
            float x = i * 1.0F * w / 4;
            g2.setFont(randomFont());
            g2.setColor(randomColor());
            g2.drawString(s, x, h - 5);

        }
        this.text = sb.toString();
        drawLine(image);

        // 返回图片
        return image;

    }

    // 得到验证码的文本 后面是用来和用户输入的验证码 检测用
    public String getText() {
        return text;
    }

    // 定义输出的对象和输出的方向
    public static void output(BufferedImage bi, OutputStream fos)
            throws FileNotFoundException, IOException {
        ImageIO.write(bi, "JPEG", fos);
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         metadata-complete="true"
         version="4.0">
    <servlet>
        <servlet-name>loginjsp</servlet-name>
        <jsp-file>/login.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>loginjsp</servlet-name>
        <url-pattern>/login.jsp</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>succ1jsp</servlet-name>
        <jsp-file>/succ1.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>succ1jsp</servlet-name>
        <url-pattern>/succ1.jsp</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>succ2jsp</servlet-name>
        <jsp-file>/succ2.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>succ2jsp</servlet-name>
        <url-pattern>/succ2.jsp</url-pattern>
    </servlet-mapping>

    <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>baoming.LoginServlet</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>VerifyCodeServlet</servlet-name>
        <servlet-class>baoming.VerifyCodeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>VerifyCodeServlet</servlet-name>
        <url-pattern>/VerifyCodeServlet</url-pattern>
    </servlet-mapping>

</web-app>

相关文章

网友评论

      本文标题:自定义标签JSTL标签库

      本文链接:https://www.haomeiwen.com/subject/hcvvwqtx.html