JavaEE 模拟登录作业实现自动登录、生成并检验验证码和打印图片到网页

作业要求

	作业名称:模拟登录
	
	作业目的:掌握Servlet、Session、Cookie等对象的应用
	
	作业要求:
	
	     (1)实现验证码生成及验证;
	
	     (2)模拟数据库登录验证;
	
	     (3)模拟自动登录功能;

项目结构

  • demo
    • src
      • cn
        • doLogin
        • doSearch
        • getCode
        • judgeAuto
        • loginOut
        • viewMyPhoto
        • Filter
          • altCharacterEncodingFilter
    • web
      • index.jsp
      • homePage.jsp
      • loginPage.jsp

代码实现

jsp

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <meta charset="UTF-8">
  <title>我的引导页</title>
  <style type="text/css">
    body{
      width: 100%;
      height: 100%;
      font-family: 'Open Sans',sans-serif;
      margin: 0;
      /*background-image: linear-gradient(to right, skyblue,lightpink);*/
      background-color: black;
    }
    .weui-btn{
      position: relative;
      display: block;
      margin: 0 auto;
      height: 50px;
      width: 600px;
      margin-top: 400px;
      padding: 8px,24px;
      font-weight: 500;
      font-size: 35px;
      text-align: center;
      text-decoration: none;
      color: black;
      border-radius: 50px;
      overflow: hidden;
      -webkit-tap-highlight-color: black;
      background-color: white;
    }
  </style>
</head>
<body>
  <center>
    <div>
      <a href="/demo/cn/judgeAuto" class="weui-btn">Enter The Project</a>
    </div>
  </center>
</body>
</html>

homePage.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>myHomePage</title>
	<style>
	    input{
	        width: 278px;
	        height: 40px;
	        margin-bottom: 10px;
	        outline: none;
	        padding: 10px;
	        font-size: 13px;
	        color: black;
	        text-shadow:1px 1px 1px;
	        border-top: 1px solid #312E3D;
	        border-left: 1px solid #312E3D;
	        border-right: 1px solid #312E3D;
	        border-bottom: 1px solid #56536A;
	        border-radius: 7px;
	        background-color: gainsboro;\
	    font-size: 200;
	
	    }
	    .weui-btn{
	        position: relative;
	        display: block;
	        margin: 0 auto;
	        height: 50px;
	        width: 600px;
	        margin-top: 400px;
	        padding: 8px,24px;
	        font-weight: 500;
	        font-size: 35px;
	        text-align: center;
	        text-decoration: none;
	        color: white;
	        border-radius: 50px;
	        overflow: hidden;
	        -webkit-tap-highlight-color: #FFFFFF;
	        background-color: grey;
	    }
	    .but{
	        width: 100px;
	        min-height: 40px;
	        background-color: #696969;
	        border: 1px solid #3762bc;
	        color: #fff;
	        padding: 9px 14px;
	        font-size: 15px;
	        line-height: normal;
	        border-radius: 5px;
	        text-decoration: none;
	
	    }
	</style>
</head>
<body style="background-color: black">
<center>
            <div style="margin-top: 50px">
            <form action="cn/doSearch">
                <input type="text" required="required" placeholder="Search In here!" name="keywords">
                <input type="submit" class="but">
            </form>
            </div>
            <div style="margin-top: 50px">
                <a href="cn/viewMyPhoto" class="but">View The Photo</a>
            </div>

            <div style="margin-top: 50px">
            <a href="cn/loginOut" class="but"> 退出登录</a>
            </div>

</center>
</body>
</html>

loginPage.jsp(自动忽略html代码,丑不堪言)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="GBK">
    <title>LoginPage</title>
    <link rel="stylesheet" type="text/css" href="Login.css"/>
    <style>
        #login{
            position: absolute;
            top: 20%;
            left:41%;
            margin-left: ;
            width: 300px;
            height: 300px;
        }
        #login h1{
            color: white;
            text-shadow:0 0 1px;
            letter-spacing: 1px;
            text-align: center;
        }
        .myinput{
            width: 300px;
            height: 30px;
            margin-bottom: 10px;
            outline: none;
            padding: 10px;
            font-size: 13px;
            color: white;
            text-shadow:1px 1px 1px;
            border-top: 1px solid #312E3D;
            border-left: 1px solid #312E3D;
            border-right: 1px solid #312E3D;
            border-bottom: 1px solid #56536A;
            border-radius: 4px;
            background-color: dimgray;
        }
        .but{
            width: 300px;
            min-height: 30px;
            display: block;
            background-color: dimgray;
            color: #fff;
            padding: 9px 14px;
            font-size: 15px;
            line-height: normal;
            border-radius: 5px;
            margin: auto;
            text-decoration: none;

        }
    </style>
	<script type="text/javascript">
	        function refreshicode() {
	            obj = document.getElementById("ICode");
	            obj.src =  "/demo/cn/getCode"+"?"+Math.random();
	        }
	</script>
</head>
<body style="background-color: black">
<div id="login">
    <h1>Login</h1>
    <form action="/demo/cn/doLogin"%>
        <input type="text" required="required" placeholder="用户名:初始用户名zhangsan" name="username"  class="myinput" ></input>
        <input type="password" required="required" placeholder="密码:初始密码123" name="password"  class="myinput" )%></input>
        <input type="text" required="required" placeholder="验证码" name="MyYZM" class="myinput"></input>
        <img id="ICode" src="/demo/cn/getCode" onclick="refreshicode()"> <a href="javascript:void(0);" onclick="refreshicode()" style="text-decoration: none;font-size: 20px;color: #FFFFFF;" >看不清,换一张</a><br>
        <input type="checkbox" value="yes" name="pageAutoLogin" style="width: 20px;height: 20px;"><b style="font-size: 20px; color: #FFFFFF;">自动登录</b>
        <button class="but" type="submit">登录</button>
    </form>
</div>
</body>
</html>

Servlet包

doLogin

package cn;

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

@WebServlet(name = "doLogin",urlPatterns = {"/cn/doLogin"})
public class doLogin extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        boolean flag = false;                                   //用来判定cookie里是否有那个自动登录的cookie
        boolean YZM = false;                                    //用来判断验证码是否合理
        String name;
        String pwd;
        String UserYZM = "";
        String SystemYZM =  "";
        Cookie[] cookies = request.getCookies();
        HttpSession session = request.getSession();
        response.setContentType("text");
        PrintWriter out = response.getWriter();
        SystemYZM = (String) session.getAttribute("SystemYZM");
        String cookieAutoLogin = (String) session.getAttribute("cookieAutoLogin");  //  cookieAutoLogin 看会话里有没有cookies,有的话就设置flag为ture

        if (cookieAutoLogin!=null && cookieAutoLogin.equals("yes")){                   //判断cookie里是否存在自动登录的标记,存在的话将flag和YZM设为ture用来跳过给浏览器发用户名和密码的cookie,跳过验证码检测
            flag = true;
            YZM = true;
            name = (String) session.getAttribute("loginUsername");
            pwd = (String) session.getAttribute("loginPassword");
            UserYZM = SystemYZM;
        }else{                                                                         //如果没有标记,那么就要从loginPage读入需要的信息,并且检测验证码
            flag = false;
            name = request.getParameter("username");
            pwd = request.getParameter("password");
            UserYZM = request.getParameter("MyYZM");
            YZM = isEqualYZM(SystemYZM,UserYZM);
        }

        if (YZM && "zhangsan".equals(name) && "123".equals(pwd)){
            session.setAttribute("login", true);                                //判断已经登录的标记,未登录不能进行查看图片操作
            session.setMaxInactiveInterval(300);
            //设置cookie
            if (!flag){                                                               //此处会有bug,当有自动登录标记时,修改密码会导致登录失败并且无法发送新的登录cookie
                Cookie loginUsername = new Cookie("loginUsername",name);
                Cookie loginPassword = new Cookie("loginPassword",pwd);
                loginUsername.setMaxAge(3600);
                loginPassword.setMaxAge(3600);
                loginUsername.setPath("/");
                loginPassword.setPath("/");
                response.addCookie(loginUsername);
                response.addCookie(loginPassword);
            }
            String pageAutoLogin = request.getParameter("pageAutoLogin");
            if (pageAutoLogin != null && pageAutoLogin.equals("yes")){              //检测勾选自动登录标记,创建一个一小时的自动登录标记cookie
                Cookie auto = new Cookie("cookieAutoLogin","yes");
                auto.setMaxAge(3600);
                auto.setPath("/");
                response.addCookie(auto);
            }

            response.sendRedirect("/demo/homePage.jsp");
        }else {
            response.sendRedirect("/demo/loginPage.jsp");
        }
    }
    private static boolean isEqualYZM(String SystemYZM,String UserYZM){
        return SystemYZM.equals(UserYZM);
    }
}

doSearch

package cn;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "doSearch",urlPatterns = {"/cn/doSearch"})
public class doSearch extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String keywords = request.getParameter("keywords");
            Cookie cKeywords = new Cookie("hisKeywords",keywords);
        String hisKeywords = "";
        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length ; ++i){
            if ( "hisKeywords".equals(cookies[i].getName())){
                hisKeywords = cookies[i].getValue();
            }
        }
        cKeywords.setMaxAge(3600); // 设置有效时间为一小时
        cKeywords.setPath("/");
        response.addCookie(cKeywords);
        out.println("你查询的是   " + keywords);
        out.println("上次查询的是 " + hisKeywords);
    }
    }

getCode (获得登录的验证码)

package cn;

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

@WebServlet(name = "getCode",urlPatterns = {"/cn/getCode"})
public class getCode extends HttpServlet {
        public static int W = 100;
        public static int H = 50;

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletOutputStream out = response.getOutputStream();
            BufferedImage image = new BufferedImage(W , H ,BufferedImage.TYPE_INT_BGR);
            
            Graphics gs = image.getGraphics();      //定义画笔
            gs.setColor(Color.white);
            gs.fillRect(0,0,W,H);

            //画边界框
            gs.setColor(Color.BLUE);
            gs.drawRect(1,1,W-2,H-2);

            int x0 = 10;
            String CODE = "";
            // 写验证码
            int count = 4;
            while (count > 0){
                count--;
                int num = getRandomNum(10);
                int r = getRandomNum(256);
                int g = getRandomNum(256);
                int b = getRandomNum(256);
                gs.setColor(getRandomColor());
                gs.setFont(new Font("宋体",Font.BOLD,20));
                gs.drawString(num + "",x0,40);
                CODE += num + "";
                x0 += 20;
            }
            //画干扰线
            count = 10;
            while (count>0){
                count--;
                int x1 = getRandomNum(W);
                int x2 = getRandomNum(W);
                int y1 = getRandomNum(H);
                int y2 = getRandomNum(H);
                gs.setColor(getRandomColor());
                gs.drawLine(x1,y1,x2,y2);
            }
            HttpSession session = request.getSession();
            session.setAttribute("SystemYZM",CODE);
//            System.out.println("验证码是:  " + CODE);
            ImageIO.write(image,"jpg",out);
        }
        public static int getRandomNum(int max){return (int)(Math.random()*max);}//获得一个随机数
        public static Color getRandomColor(){
            int r = getRandomNum(256);
            int g = getRandomNum(256);
            int b = getRandomNum(256);
            Color c = new Color(r,g,b);
            return c;
        }
    }

judgeAuto

package cn;

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

@WebServlet(name = "judgeAuto",urlPatterns = {"/cn/judgeAuto"})
public class judgeAuto extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Cookie[] cookies = request.getCookies();

        for (int i = 0;cookies!= null && i < cookies.length ; ++i){                     //遍历跟随HttpRequest请求而来的cookies
            if (cookies[i].getName().equals("cookieAutoLogin")){                        //如果有自动登录标记cookie
                if (cookies[i].getValue().equals("yes")){                               //并且cookie值有用
                    session.setAttribute("cookieAutoLogin","yes");
                }
            }
            if ( "loginUsername".equals(cookies[i].getName()) ){
                session.setAttribute("loginUsername",cookies[i].getValue());
            }
            if ("loginPassword".equals(cookies[i].getName())){
                session.setAttribute("loginPassword",cookies[i].getValue());
            }
        }
        String cookieAutoLogin = (String)session.getAttribute("cookieAutoLogin");
        if (cookieAutoLogin!=null && cookieAutoLogin.equals("yes")){
            response.sendRedirect("/demo/cn/doLogin");
        }else{
            response.sendRedirect("/demo/loginPage.jsp");
        }

    }
}

loginOut

package cn;

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

@WebServlet(name = "loginOut",urlPatterns = {"/cn/loginOut"})
public class loginOut extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Cookie cookie = new Cookie("cookieAutoLogin","no");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        session.invalidate();
        response.sendRedirect("/demo/loginPage.jsp");
    }
}

viewMyPhoto

package cn;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "viewMyPhoto",urlPatterns = {"/cn/viewMyPhoto"})
public class viewMyPhoto extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Object login = session.getAttribute("login");
        if (login!=null && (boolean)login){
            String photoPath = getServletContext().getRealPath("WEB-INF/classes/cn/img/tubiao.png");
            FileInputStream input = new FileInputStream(photoPath);
            byte[] b = new byte[1024];
            int len = 0;
            ServletOutputStream out = response.getOutputStream();
            while (((len) = input.read(b)) > 0){
                out.write(b,0,len);
            }
            out.flush();
            out.close();
            input.close();
        }else{
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            PrintWriter writer = response.getWriter();
            writer.println("你没登陆!给爷登!");
        }
    }
}

Filter

altCharacterEncodingFilter

package cn.Filters;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.HttpCookie;

@WebFilter(filterName = "altCharacterEncodingFilter",urlPatterns = {"/cn/*"})
public class altCharacterEncodingFilter implements Filter {
    private FilterConfig config;
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        String myencoding = config.getInitParameter("myencoding");
        req.setCharacterEncoding("GBK");
        resp.setCharacterEncoding("GBK");
        chain.doFilter(req, resp);
    }
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
    public void destroy() {
    }
}

登录流程图:

是否有cookieAutoLogin
N
Y
index.jsp
judgeAuto
loginPage.jsp
doLogin
homePage

Some Key Point(小笔记)

(1)Filter里doFilter方法中ServletRequest request是无法获取到客户端请求中的cookie,需要用强制转换,可以通过在过滤器里完成对cookie的筛选。

HttpServletRequest request = (HttpServletRequest)req;

(2)理清绝对路径和相对路径的区别
我的理解是参照物的不同,绝对路径是以根目录为参照,而相对路径是以被相对的路径节点为参照。例如有路径/A/B/C ,A为根目录。那么B/C是C相对B的相对路径,/A/B/C即为绝对路径。在编码过程中,由于转发和重定向的区别,会引起路径的报错!!

(3)cookie的路径不要写/*,识别不出;
(4)要“kill”一个cookie的时候,将path和name设置相同,将有效时间设为-1并 session.invalidate();why?我发现在谷歌浏览器中,会话关闭后cookie才会消失

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值