作业名称:模拟登录
作业目的:掌握Servlet、Session、Cookie等对象的应用
作业要求:
(1)实现验证码生成及验证;
(2)模拟数据库登录验证;
(3)模拟自动登录功能;
<%@ 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 Projecta>
div>
center>
body>
html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>myHomePagetitle>
<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 Photoa>
div>
<div style="margin-top: 50px">
<a href="cn/loginOut" class="but"> 退出登录a>
div>
center>
body>
html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="GBK">
<title>LoginPagetitle>
<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>Loginh1>
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);
}
}
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);
}
}
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;
}
}
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");
}
}
}
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");
}
}
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("你没登陆!给爷登!");
}
}
}
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() {
}
}
登录流程图:
(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才会消失