JSP——(七天免登陆和文件上传下载)

一,Cookie实现七天免登陆

1.1 实现过程分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oktBlmDF-1570116023180)(C:\Users\lmc\Desktop\我的笔记\images\assets\七天免登陆.png)]

1.2 实现过程

1.2.1 创建一个登陆页面

定义一个LoginServlet,向页面输出一个登陆表单。

package lmc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
	登录页面
*/
public class LoginServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        // 输出一个登录表单
        resp.getWriter().write("<h1>用户登录</h1>");
        resp.getWriter().write("<form action='/lmc/loginAction.do' method='post'>");
        resp.getWriter().write("用户名:<input name='username' type='text' /><br/>");
        resp.getWriter().write("密码:<input name='password' type='password' /><br/>");
        resp.getWriter().write("是否七天登录:<input name='isAutoLogin' value='true' type='checkbox' /><br/>");
        resp.getWriter().write("<input value='登录' type='submit' />");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

1.2.2 实现登陆功能

第一步:定义一个LoginActionServlet类;

第二步:获取登录表单参数;

第三步:判断用户名和密码是否正确;

​ 1)如果登录成功,那么用户名就保存在Session对象中;

package lmc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
	用户登录验证
*/
public class LoginActionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        // 如果登录成功
        if ("admin".equals(username) && "111".equals(password)){
            // 把用户名保存在session中
            req.getSession().setAttribute("username",username);
            // 如果isAutoLogin不为true,那么就把用户登录信息保存在Cookie中
            boolean isAutoLogin = Boolean.valueOf(req.getParameter("isAutoLogin"));
            if (isAutoLogin){
                Cookie c = new Cookie("username",username);
                c.setMaxAge(60 * 60 * 24 * 7);
                resp.addCookie(c);
            }else {
                // 如果没有选择免登陆,那么就从cookie中删除用户的登录信息。
                Cookie c = new Cookie("username","");
                c.setMaxAge(0);
                resp.addCookie(c);
            }
            // 重定向到后台首页
            resp.sendRedirect("/lmc/home.do");
        }else {
            Cookie[] cookies = req.getCookies();
            boolean mark = false;
            for (Cookie c:cookies) {
                if ("username".equals(c.getName())){
                    req.getSession().setAttribute("username",username);
                    mark = true;
                }
            }
            if (mark){
                resp.sendRedirect("/lmc/home.do");
            }else {
                resp.sendRedirect("/lmc/login.do");
            }
        }
    }
}

1.2.3 实现首页功能

package lmc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
	首页页面
*/
public class HomeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        Object username = req.getSession().getAttribute("username");
        // 如果username为null,代表用户没有登录,那么从cookie中读取用户信息
        if (username != null){
            resp.getWriter().write("欢迎回来," + username);
        }else {
            Cookie[] cookies = req.getCookies();
            // 记录cookie中是否存在username属性
			// 如果存在为true,否则为false
            boolean mark = false;
            for (Cookie c:cookies) {
                if ("username".equals(c.getName())){
                    // 从cookie获取用户之前登录过的信息
                    req.getSession().setAttribute("username",c.getValue());
                    resp.getWriter().write("欢迎回来," + c.getValue());
                    mark = true;
                }
            }
            // 如果mark为false,代表cookie中没有用户的登录信息
            if (!mark){
                resp.sendRedirect("/lmc/login.do");
            }
        }
    }
}

二,文件上传

2.1 文件上传表单和普通表单的区别

  • 文件上传表单只能是post请求;而普通表单可以是post,也可以是get;
  • 文件上传表单需要指定enctype="multipart/form-data"属性,而普通表单不需要指定enctype属性;
  • 提交文件上传表单的时候,每一个表单都有自己独立的头信息,而普通表单项的头信息都是相同;
  • 文件上传表单不能通过request.getParamter()方法获取表单数据,只能够通过getInputStream方法获取表单的数据。

2.2 使用FileUpload工具实现文件上传

第一步:在工程中引入fileupload相关的jar包(commons-fileupload-1.4.jar,commons-io-2.6.jar);

第二步:创建DiskFileItemFactory对象,该对象负责产生FileItem对象;

第三步:创建ServletFileUpload对象,该对象负责解析Request请求;

第四步:调用ServletFileUpload对象的parseRequest方法解析请求;

如下所示:

package com.lmc.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

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.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //创建一个FileItem的工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //创建解析器对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        //使用解析器解析请求
        try {
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            //遍历所有的FileItem
            for (FileItem fi: fileItems) {
                //判断是否为普通表项
                if (fi.isFormField()){
                    String name = fi.getString();
                    resp.getWriter().write("普通表项的内容:" + name + "<br>");
                }else { //表示不是普通表项,即为文件
                    fi.getString("utf-8");
                    //获取输入流
                    InputStream inputStream = fi.getInputStream();
                    //获取uploads文件夹在磁盘上的路径
                    String savePath = this.getServletContext().getRealPath("/WEB-INF/uploads");
                    //创建数据的输出通道
                    FileOutputStream fileOutputStream = new FileOutputStream(savePath + "/" + fi.getName());
                    int len = -1;
                    byte[] buf = new byte[1024];
                    len = inputStream.read(buf);
                    while (len != -1){
                        fileOutputStream.write(buf,0,len);
                        len = inputStream.read(buf);
                    }
                    resp.getWriter().write("文件"+fi.getName() + "上传成功!<br>");
                    resp.getWriter().write("上传文件的类型:"+ fi.getContentType());
                    fileOutputStream.close();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}

FileItem代表了普通表单项和文件表单项。它提供了一些获取表单项信息的方法:

  • getName():获取上传文件的名称;
  • getFieldName():获取表单项的name属性值;
  • isFormField():判断该表单项是否是普通表单项,如果该方法返回true,那么就是普通的表单项;否则就是文件上传表单项;
  • getString():获取普通表单项的内容;
  • getInputStream():获取文件上传的输入流对象;
  • getContentType():获取表单项的类型,该方法可以用于校验上传文件的类型;
  • getSize():获取上传文件的大小,以字节为单位。该方法可以用于校验上传文件的大小;

我们还可以去限制文件的类型,大小等,具体做法如下:

/**
	 * 判断FileItem文件表单项是否超过了10Kb
	 * @param fi
	 * @return
	 */
	public boolean checkSize(FileItem fi) {
		long size = fi.getSize();
		/*if (size > 1024 * 10) {
			return false;
		}
		return true;*/
		return !(size > 10240);
	}
	
	/**
	 * 判断FileItem文件表单项是否是图片,如果是就返回true,否则返回false。
	 * @param fi
	 * @return
	 */
	public boolean isValid(FileItem fi) {
		String contentType = fi.getContentType(); //例如:image/jpeg
		String regex = "image/[a-zA-Z]{3,4}"; //验证图片的正则
		return contentType.matches(regex);
	}

通过ServletFileUpload对象的setFileSizeMax方法,指定上传文件的大小。如果上传文件超过了指定大小,那么就会抛出异常。

三,文件下载

第一步:设置文件下载的响应头;

第二步:获取下载地址的绝对路径;

第三步:创建文件输入流对象;

第四步:读取图片,把图片数据写出浏览器;

第五步:关闭资源。

package com.chinasofti.day11.servlet;

import java.io.FileInputStream;
import java.io.IOException;

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;

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// 文件下载的响应头Content-Disposition
		resp.setHeader("Content-Disposition", "attachment;filename=good.jpg");
		// 获取upload目录的绝对路径
		String uploadPath = req.getServletContext().getRealPath("/WEB-INF/upload");
		// 创建文件输入流对象
		FileInputStream fis = new FileInputStream(uploadPath + "/good.jpg");
		// 读取图片,把图片数据写出浏览器中
		ServletOutputStream outputStream = resp.getOutputStream();
		byte[] buf = new byte[1024];
		int len = -1;
		while ((len = fis.read(buf)) != -1) {
			outputStream.write(buf, 0, len);
		}
		// 关闭资源
		fis.close();
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值