javaweb09 HttpSerlvetResponse、HttpServletRequest、Cookie、Session、下载文件、生成验证码、重定向
admin
2024-05-11 13:40:14

文章目录

      • 一、HttpSerlvetResponse
      • 二、下载文件
      • 三、验证码的实现
      • 四、重定向
      • 五、登录功能的实现
      • 六、HttpServletRequest
      • 七、Cookie
      • 八、Session

一、HttpSerlvetResponse

web服务器接收到客户端的http请求,针对这个请求分别创建一个代表请求的HttpServletRequest对象和一个代表响应的一个HttpSerlvetResponse对象
获取客户端传来的参数,找HttpServletRequest
如果要给客户端响应一些信息,找HttpSerlvetResponse

负责向浏览器发送数据的方法(HttpSerlvetResponse)

ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法(HttpSerlvetResponse)

void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);

应用:
1、向浏览器输出信息
2、下载文件
①要获取下载文件的路径
②下载的文件名是什么
③设置想办法我们能让浏览器支持下载我们需要的东西
④获取下载文件的输入流
⑤创建缓冲区
⑥获取OutputStream对象
⑦将FileOutputStream流写入到buffer缓冲区
⑧使用OutputStream将缓冲区中的数据输出到客户端

二、下载文件

package chap2;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1、要获取下载文件的路径String realPath = getServletContext().getRealPath("/img/img1.jpg");System.out.println("下载文件的路径"+realPath);//2、下载的文件名是什么String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);//3、设置想办法我们能让浏览器支持下载我们需要的东西resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));//4、获取下载文件的输入流FileInputStream in = new FileInputStream(realPath);//5、创建缓冲区int len=0;byte[] buffer = new byte[1024];//6、获取OutputStream对象ServletOutputStream out = resp.getOutputStream();//7、将FileOutputStream流写入到buffer缓冲区//8、使用OutputStream将缓冲区中的数据输出到客户端while ((len=in.read(buffer))>0){out.write(buffer,0,len);}in.close();out.close();}
}

三、验证码的实现

package chap2;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;public class ImageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//让浏览器三秒刷新一次resp.setHeader("refresh","3");//在内存中创建一个图片BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//得到图片Graphics2D graphics = (Graphics2D) image.getGraphics();//笔//设置图片的背景颜色graphics.setColor(Color.white);graphics.fillRect(0,0,80,20);//给图片写数据graphics.setColor(Color.BLUE);graphics.setFont(new Font(null,Font.ITALIC,20));graphics.drawString(makenum(),0,20);
//        告诉浏览器,这个请求是用图片的方式打开的resp.setContentType("image/jpeg");
//        网站存在缓存,不让浏览器缓存resp.setDateHeader("expires",-1);resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma","no-cache");
//        把图片写给浏览器ImageIO.write(image,"jpg",resp.getOutputStream());}private String makenum(){Random random = new Random();String num = random.nextInt(999999) + "";StringBuffer stringBuffer = new StringBuffer();for (int i = 0; i <7-num.length() ; i++) {stringBuffer.append("0");}String s=stringBuffer.toString()+num;return s;}
}

四、重定向

B收到A的请求后,通知A去访问C,即重定向
常见场景:用户登录

    void sendRedirect(String var1) throws IOException;
package chap2;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 RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        重定向的原理
//        resp.setHeader("Location","/image");
//        resp.setStatus(302);resp.sendRedirect("/image");}
}

五、登录功能的实现

<%--设置中文编码--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%--设置识别EL表达式--%>
<%@page isELIgnored="false" %>


Hello World!

用户名:
密码:
package chap2;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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if (username.equals("admin")&&password.equals("123456")){resp.sendRedirect("/image");}else {resp.sendRedirect("index.jsp");}}
}

六、HttpServletRequest

HttpServletRequest代表客户端的请求
用户通过Http协议访问服务器,Http请求中的所有信息都会被封装到HttpServletRequest对象中
通过HttpServletRequest的方法获取所有信息

<%--Created by IntelliJ IDEA.User: KerwinWanDate: 2023/1/13Time: 19:09To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

登录


用户名:
密码;
爱好:女孩代码唱歌电影
package chap2;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;public class LoginServlet2 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("Utf-8");String username = req.getParameter("username");String password = req.getParameter("password");String[] hobbies = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobbies));if (username.equals("admin")&&password.equals("123456")){resp.sendRedirect("/image");}else {resp.sendRedirect("index.jsp");}}
}

七、Cookie

会话:用户打开一个浏览器,点击了很多的超链接,访问了多个web资源,关闭浏览器,这样的过程成为会话
有状态会话:一个客户端访问过服务端后,下次访问的时候服务器已经认识这个客户端了,即有状态会话
如何证明一个网站来过:
1、服务器给客户端一个信件,客户端下次访问服务器带上信件就可以(信件也就是cookie)
2、服务器登记你来过了,下次你来的时候我来匹配你

cookie和session是保存会话的两种技术
cookie是客户端技术,session是服务器技术,可以保存会话信息
cookie一般会保存在本地的 用户目录下(appdata)

cookie的一些细节:
1、一个cookie只能保存一个信息
2、一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
3、cookie大小有限制4kb
4、浏览器最多有300个cookie

删除cookie:
1、不设置有效期,关闭浏览器,自动失效。
2、设置有效期为0。

package chap2;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;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.sql.Date;
import java.util.Arrays;//保存用户上一次访问时间
public class CookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        服务器直接告诉用户来的时间,时间作为一个信件,下次带来
//        解决中文乱码问题req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html");PrintWriter out = resp.getWriter();
//      cokkie,服务器端从客户端获取Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie存在多个
//        判断cookie是否存在System.out.println(Arrays.toString(cookies));System.out.println(cookies.length);
//        编码解码System.out.println(URLEncoder.encode("张三","UTF-8"));System.out.println(URLDecoder.decode("kewein","UTF-8"));if (cookies.length>1){out.write("你上次访问的时间是");for (int i = 0; i < cookies.length; i++) {Cookie cookie = cookies[i];
//                getName()方法获取cookie的key   getValue()方法获取cookie的valueif (cookie.getName().equals("lastLoginTime")){long lastLoginTime=Long.parseLong(cookie.getValue());Date date = new Date(lastLoginTime);out.write(date.toLocaleString());}}}else {out.write("这是第一次访问本站");}
//        新建cookieCookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//        设置cookie有效期为1天cookie.setMaxAge(24*60*60);
//        响应给客户端的一个cookieresp.addCookie(cookie);}
}

八、Session

服务器给每个用户创建一个Session对象
一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
用户登录之后,整个网络都可以访问
常用于保存用户的信息、保存购物车的信息等
每个用户的sessionid唯一

web.xml文件设置session默认失效时间


15

cookie和session的区别
cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
session把用户的数据写到用户独占session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
session对象由服务器创建

package chap2;import chap2.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;public class SessionServlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        解决乱码问题req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("UTF-8");
//        得到session对象HttpSession session = req.getSession();
//        给session中存东西session.setAttribute("name",new Person("lisi",18));
//        获取session的IDString id = session.getId();
//        判断Session是不是新建的if (session.isNew()){resp.getWriter().write("session创建成功,ID:"+id);}else {resp.getWriter().write("session已经在服务器存在,ID:"+id);}
//        session创建过程中如何运行
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);}
}
package chap2;import chap2.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        解决乱码问题req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("UTF-8");
//        得到session对象HttpSession session = req.getSession();
//        给session中存东西Person person = (Person) session.getAttribute("name");System.out.println(person.toString());}
}
package chap2;import chap2.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionServlet3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        解决乱码问题req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("UTF-8");
//        得到session对象HttpSession session = req.getSession();
//        删除session中的数据session.removeAttribute("name");
//        手动注销sessionsession.invalidate();}
}

相关内容

热门资讯

敦煌壁画的守护人--敦煌戈徒旅... 昨天刷抖音本来是想随便打发下时间,结果一个“穿越千年的敦煌色彩”的视频直接把我钉在原地,越看越入迷,...
湖南红色旅游主题口号及形象标识... 近日,由湖南省文化和旅游厅主办的湖南红色旅游主题口号及形象标识(LOGO)征集活动圆满结束,获奖作者...
2024年山西省旅游业大数据报... 今天分享的是:2024年山西省旅游业大数据报告 报告共计:20页 2024年山西省旅游业实现高质量增...
中国跻身南极第二大客源国,深圳... 深圳商报·读创客户端记者 范宏韬 11月18日,俞敏洪一连发布10条南极旅行视频,从穿越德雷克海峡到...
螺髻山温泉撷影 螺髻山温泉位于四川省凉山彝族自治州普格县螺髻山镇,该景区是我国山地中极为罕见且保存完好的第四纪古冰川...