一,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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81669.html