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

文章目录

      • 一、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();}
}

相关内容

热门资讯

《我在他乡挺好的》一剧里,简亦... 《我在他乡挺好的》一剧里,简亦繁结局怎么样?《我在他乡挺好的》中简亦繁结局和乔夕辰走到了一起,可以说...
fiction和novel的区... fiction和novel的区别是什么?除了novel指长篇小说,fiction范围更广之外它们还有...
成都的简称 成都的简称成都市的简称为“蓉”。
脸上长疖子怎么治 脸上长疖子怎么治我也总是爱起火疖子,疼是必然的,只要在晚上睡觉前在患处涂抹少量的红霉素软膏就可以消肿...
瀚海乾坤罩到底是什么 瀚海乾坤罩到底是什么《斗罗大陆》里的瀚海乾坤罩 有什么秘密? 是谁在里面瀚海乾坤罩是海神三...
书荒!求类似于重生之赵小涵向前... 书荒!求类似于重生之赵小涵向前冲 才女当家这种类型的长篇重生文 结局和文笔要好的再说一次我爱你
西藏七天六晚跟团游攻略,西藏旅... 西藏七天六晚跟团游攻略,西藏旅游7天费用是多少? 暑假,是一年中最适合出游的时段之一,而西藏,那片神...
去新疆旅游攻略七日游,新疆7天... 新疆,这片位于中国西北边陲的神秘土地,以其广袤无垠的沙漠、巍峨壮丽的天山、色彩斑斓的湖泊以及独特的民...
黄山四天三晚景点推荐,黄山四天... 黄山,是一处大自然的奇迹,是地球上最令人惊叹的自然景观之一。它的奇松,或挺拔于山峰之巅,或扎根于悬崖...
杀生为护生,斩业非斩人,这句话... 杀生为护生,斩业非斩人,这句话谁说的那你到是说说,这句话错在哪儿,那么正确的又当如何啊出自《霹雳布袋...
原创 打... 作者/摄影:莫国良 住宿延边珲春市区,隔日与上海的老乡拼车去打卡我国最让人遗憾的国界线珲春防川。实话...
杭盖草原上的“鞍匠”阿拉坦巴根... 中新网 兴安盟7月8日电 题:杭盖草原上的“鞍匠”阿拉坦巴根:守艺“马背摇篮” 中新网 记者 张玮 ...
西安5天跟团纯玩报名方式,西安... 家人们,我敢打赌,在每一个热爱旅行、怀揣历史情怀的人心中,西安绝对有着不可撼动的地位。这座十三朝古都...
求一首粤语歌 求一首粤语歌杜丽莎《若你要离开我》若你要离开我,若你觉得好过,请你挥手,请你挥手。若你要离开我,若你...
四川本地团暑期特惠,3天2晚跟... 每年暑期,都是亲子家庭出游的黄金时段。我和爱人一直盼着能带孩子出去长长见识,开阔开阔眼界。可一想到规...
【走进泰国】2026泰国QS排... 全球高等教育分析机构QS Quacquarelli Symonds(QS)于今日正式发布了2026Q...
黄山4天3晚美食推荐,黄山4天... 黄山,不仅是一座自然奇观的宝库,更是一座承载着深厚历史文化底蕴的名山。自古以来,黄山便是文人墨客的灵...
工作我受委屈老公不理解我反而会... 工作我受委屈老公不理解我反而会说我的不是,我怎么办?可以感受到作为一个在外面受尽委屈回家后的老婆,她...
上海人去了太原和运城,直言不讳... 作为土生土长的上海小囡,总以为北方城市都是“差不多”的豪爽画风。但这次山西之行,我特意选了太原和运城...