2022-10-23——Request和Response

本文详细介绍了在Servlet中如何使用Request和Response对象处理请求和响应。讲解了请求转发与响应重定向的区别,前者是服务器内部跳转,只产生一次请求,后者则会导致两次请求。在重定向中,由于请求的断开,需要使用Session来保存共享数据。同时,示例展示了如何生成并输出验证码图片,强调了验证码在防止恶意注册中的作用。

目录

Request:是请求对象。Response:是应答对象

 Request获取请求行数据  

​编辑

Request请求转发

Respones重定向

请求转发与响应重定向的区别

心得:


Request:是请求对象。Response:是应答对象

由页面请求到Servlet,由Servelt的service(request,response)方法应答给页面。           request对象是用来封装请求数据的对象    。                                                                           response对象是用来封装响应数据的对象 。                                                                                    

Request:使用request对象来==获取==请求数据
Response:使用response对象来==设置==响应数据

 Request获取请求行数据  

请求行数据包括三部分{分别是 请求方式 请求资源路径 HTTP协议及版本};对于这三部分内容,request对象都提供了对应的API方法来获取。

Request请求转发

1. 请求转发(forward):一种在服务器服务器内部的资源跳转

2.实现方式:request.getRequestDispatcher("资源路径").forward(request,response); 

Respones重定向

1. Response重定向(redirect):一种资源跳转方式。

请求转发与响应重定向的区别

1.请求转发是服务器跳转,只会产生一次请求。请求转发语句

request.getRequestDispatcher().forward().

 

2.重定向是向浏览器跳转,会产生两次请求。响应重定向语句是

response.sendRedirect()

Session
response重定向产生两次请求,导致第一次存入request对象的共享数据第二次无法获取,因此要将数据存入一个范围更大的对象Session。

实现方式:

request.getSession().setAttribute(key,Object);
request.getSession().getAttribute(key);

Response响应字符
response.setContentType( "text/html" ); "text/xml" "text/json"
Response响应字节数据(验证码)
response.setContentType("image/jpg"); "application/mp4"

验证码的目的:进行人机识别,以防程序大量注册。

页面生成图片验证码图片:

<img src="checkCode">

 

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //准备工作
            response.setContentType("image/jpg");
            //返回的是一个图片类型都是规定好的,如写错规定类型浏览器就无法识别类型就会下载下来

        //用的是二进制字节流
        OutputStream outputStream=response.getOutputStream();

        //生成图片
        int width=100;
        int height=50;
        //创建一个对象,能在内存中生成一个图片
        BufferedImage image=new BufferedImage(
          width,
          height,
          BufferedImage.TYPE_INT_RGB
        );
        //一、填充图片
        //2.1填充背景图片
        Graphics g= image.getGraphics();
        g.setColor(Color.pink);
        g.fillRect(0,0,width,height);
        //2.2画边框
        g.setColor(Color.blue);
        g.drawRect(0,0,width-1,height-1);
        //2.3生成随机验证码,并画到图片中
        String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789";
        Random random=new Random();
        StringBuffer sb=new StringBuffer();
        for (int i = 0; i < 4; i++) {
            int index=random.nextInt(str.length());
            //通过下标获取字符
            char ch=str.charAt(index);//生成随机字符
            sb.append(ch);//把生成的字符添加到stringBuffer里
            g.drawString(ch+"",width/5*i,height/2);
        }
        //验证码放入到共享对象中  选择(Session)
        request.getSession().setAttribute("checkCode",sb.toString());

        //2.4 生成干扰线,让爬虫程序读不出我们生成的字符串
        g.setColor(Color.green);
        //随机生成坐标点
        for (int i = 0; i < 10; i++) {//10.fori回车自动生成for循环体
            int x1=random.nextInt(width);
            int y1=random.nextInt(height);

            int x2=random.nextInt(width);
            int y2=random.nextInt(height);

            g.drawLine(x1,y1,x2,y2);//生成线
        }
        //3.将图片输出到页面
        ImageIO.write(image,"jpg",outputStream);
    }
}

心得:

转发与重定向的差别,重定向简单理解就是多次请求,而request共享数据范围没有那么大,只能一次请求一次应答,所以转发用request。重定向用Session共享数据范围可以。在Servlet中请求处理的行为方式是,以线程的方式。

 

<think>好的,我需要回答用户关于Django中间件中process_requestprocess_response哪个更常用的问题。首先,我要回忆一下Django中间件的基本概念这两个方法的作用。 中间件在Django中处理请求响应的全局处理,每个中间件类可以定义多个方法,其中process_requestprocess_response是两个常用的。根据经验,这两个方法的使用频率可能因需求而异。 接下来,我需要分别解释这两个方法。process_request在请求到达视图之前执行,通常用于权限验证、日志记录或修改请求对象。而process_response则在视图处理完响应后执行,用于修改响应头、统一处理响应内容或记录日志。 然后,要比较它们的常用性。虽然两者都很重要,但process_request可能更常用,因为很多中间件功能如认证、CSRF保护、URL重写需要在请求到达视图前处理。例如,Django自带的AuthenticationMiddlewareCsrfViewMiddleware都使用process_request。 不过,process_response也有其不可替代的作用,比如处理跨域头或压缩响应。需要举例说明两者的应用场景,帮助用户理解它们的区别适用情况。 最后,总结两者的重要性,指出具体使用哪个取决于需求,但process_request可能稍微更常见,因为许多基础功能需要在请求处理前介入。同时强调两者都是中间件的重要组成部分,实际开发中常结合使用。</think>在Django中间件中,`process_request``process_response`的使用频率取决于具体需求,但总体来说: ### 1. `process_request` ✅ **更常用场景** - 用于请求到达视图前的预处理 - 典型应用:身份验证(如`AuthenticationMiddleware`)、CSRF检查(`CsrfViewMiddleware`)、请求参数预处理 - 特点:**直接影响后续处理流程**,能直接返回响应中断请求(如权限拦截) 示例: ```python class AuthMiddleware: def process_request(self, request): if not request.user.is_authenticated: return HttpResponseRedirect('/login/') # 直接中断请求 ``` ### 2. `process_response` ✅ **关键应用场景** - 用于统一处理所有响应 - 典型应用:设置全局HTTP头(如CORS)、响应内容压缩、统一错误格式包装 - 特点:**必须返回HttpResponse对象**,可修改所有经过中间件的响应 示例: ```python class CorsMiddleware: def process_response(self, request, response): response['Access-Control-Allow-Origin'] = "*" return response ``` ### 对比总结 | 特性 | process_request | process_response | |--------------------|----------------------------------|----------------------------------| | 执行阶段 | 请求刚到达时(路由解析前) | 视图处理完成后 | | 中断能力 | ✔️ 可直接返回响应中断流程 | ❌ 必须处理并返回给定响应 | | 典型中间件 | AuthenticationMiddleware | GZipMiddleware | | 使用频率 | 较高(涉及核心安全校验) | 较高(涉及全局响应处理) | ### 实际开发建议 1. 需要拦截请求时优先用`process_request` 2. 需要修改所有响应时必用`process_response` 3. 两者常配合使用(如:`process_request`记录请求时间,`process_response`计算耗时) 4. Django内置中间件中有5个使用`process_request`,4个使用`process_response` 结论:两者都是中间件核心方法,但`process_request`由于涉及安全校验等基础功能,在常见业务场景中使用率略高。实际应根据功能需求选择合适的方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值