response重定向传参数_JavaWeb之 response

本文详细介绍了JavaWeb中的response重定向,并探讨了如何在重定向中传递参数。同时,讲解了request对象的功能,包括获取请求头、设置编码、获取客户端IP等方法。此外,还对比了请求转发与重定向的区别,并解析了客户端路径和服务器端路径的使用场景。文中通过多个案例展示了实际应用场景,如获取用户信息、请求路径操作和实现防盗链功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

request

request功能介绍

  • 获取请求头 获取请求参数 Servlet三大域对象之一 请求包含和请求转发

request域方法

java

void setAttribute(String name, Object value):添加或替换request域属性
Object getAttribute(String name):获取request域指定名称的域属性     
void removeAttribute(String name):移除request域指定名称的域属性
Enumeration getAttributeNames():获取所有request域的属性名称

request获取请求头

String getHeader(String name):获取指定名称的请求头
int getIntHeader(String name):获取指定名称的请求头,把值转换成int类型。
Enumeration getHeaderNames():获取所有请求头名称

request请求数据相关其他方法

重点:

  • String getMethod():获取请求方式
  • String getContextPath():获取上下文路径,即“/” + 应用名称,例如:/day05_1
  • void setCharacterEncoding(String):设置请求体的编码
  • String getRemoteAddr():获取客户端IP地址

非重点:

int getContentLength():获取请求体字节数  
Locale getLocale():获取请求Locale,例如zh_CN表示中文,中国  
String getCharacterEncoding():获取请求体编码,在没有调用setCharacterEncoding()之前该方法返回null  
String getQueryString():获取参数列表,例如:username=zhangSan&password=123  
String getRequestURI():返回请求URI路径,从应用名称开始,到参数之前这一段,例如:/day05_1/AServlet  
StringBuffer getRequestURL():整个请求URL,不包含参数部分  
String getServletPath():返回Servlet路径,从应用名称后开始,到参数之前这一段,不包含应用名称。  
String getServerName():返回主机名,例如:localhost  * int getServerPort():返回服务器端口号,例如:8080

请求参数

获取请求参数,即获取超链接上的参数和表单中的参数

String getParameter(String name):获取指定名称的参数,如果存在同名参数,那么该方法只获取第一个参数值
String[] getParameterValues(String name):获取指定名称的参数,因为同名参数的存在,所以返回值为字符数组
Enumeration getParameterNames():获取所有参数名称
Map getParameterMap():获取所有参数,封装到Map中,key为参数名称,value为参数值。

请求包含和请求转发

共同点

都是在一个请求中,访问两个Servlet。
都是有一个Servlet去调用执行另一个Servlet
都可以共享request中的数据,因为都是一个请求。
都要使用RequestDispatcher对象:RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
请求转发和请求包含的路径都是服务器端路径,相对当前应用

不同点

1.从AServlet到BServlet
请求转发:在AServlet中可以设置响应头能使用响应流输出
请求包含:在AServlet可以设置响应头可以使用响应流输出
2.执行代码
请求转发:request.getRequestDispatcher("/BServlet").forward(request,response);
请求包含:request.getRequestDispatcher("/BServlet").include(request,response);

请求转发与重定向

  • 请求转发是一个请求,而重定向是两个请求
  • 请求转发,是使用RequestDispatcher来完成,重定向使用response对象来完成
  • 请求转发的路径都是服务器端路径,而重定向是客户端路径,需要给出应用名称
  • 请求转发在浏览器地址栏中的地址是第一个Servlet的路径,而重定向在地址栏中的地址是第二个请求的Servlet的路径
  • 请求转发中的两个Servlet是可以共享request数据的,而重定向因为是两个请求,所以不能共享request数据
  • 请求转发只能转发到本应用的其他Servlet,而重定向可以重定向到其他应用中。

request.getParameter()和request.getAttribute()

getParameter()  是获取客户端参数,它是从客户端传递给服务器的数据。
getAttribute()  是获取服务器端自己设置的数据,而不是客户端的数据。
request没有setParameter() 方法,不能自己设置参数,参数都由客户端传递
request有setAttribute()  方法,在getAttribute()之前,需要先setAttribute()才能获取到。
getAttribute()和setAttribute()   是用来在请求转发和请求包含中的多个Servlet中共享数据。

路径

  1. 客户端路径和服务器端路径
    1. 客户端路径需要给出应用名称,例如:/day05_1/AServlet
    2. 服务器端路径无需给出应用名称,例如:/AServlet
  2. 客户端路径
    1. 页面中都是客户端路径:
      1. 超链接的href
      2. 表单的action
      3. <img>的src
    2. 重定向也是客户端路径:response.sendRedirect("/day05_1/BServlet");
  3. 服务器端路径
    1. <url-pattern>
    2. 请求转发和请求包含
    3. ServletContext获取资源等

案例

案例一 【获取用户的IP 浏览器等信息】

package com.yuan.web.request;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Yuan-9826
 */
@WebServlet("/req/AServlet")
public class AServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        final String IP = request.getRemoteHost();
        System.out.println("IP : " + IP);
        final String method = request.getMethod();
        System.out.println("请求方式 : " + method);
        final String header = request.getHeader("User-Agent");
        System.out.println("请求头 : " + header);
/*
最后一个请求头就拿到了 操作系统 浏览器等信息
Mozilla
/5.0 (Windows NT 10.0; WOW64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome
/70.0.3538.25 Safari
/537.36 Core
/1.70.3730.400 QQBrowser
/10.5.3805.400
*/

    }
}

案例二 【请求路径演示】

package com.yuan.web.request;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Yuan-9826
 */
@WebServlet("/req/BServlet")
public class BServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //协议
        response.getWriter().print("<h1>"+request.getScheme()+"</br></h1>");
        //主机名
        response.getWriter().print("<h1>"+request.getServerName()+"</br></h1>");
        //端口
        response.getWriter().print("<h1>"+request.getServerPort()+"</br></h1>");
        //项目名
        response.getWriter().print("<h1>"+request.getContextPath()+"</br></h1>");
        //Servlet路径
        response.getWriter().print("<h1>"+request.getServletPath()+"</br></h1>");
        //参数
        response.getWriter().print("<h1>"+request.getQueryString()+"</br></h1>");
        //URI
        response.getWriter().print("<h1>"+request.getRequestURI()+"</br></h1>");
        //URL
        response.getWriter().print("<h1>"+request.getRequestURL()+"</br></h1>");
    }
}

e0d5f44342c614b46dc9589ded9a7680.png

35912cd3fa5a6bf07317b5bd3bb5642a.png

案例三 【防盗链】

补充【地址栏里输入 头信息为空】

package com.yuan.web.request;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Yuan-9826
 */
@WebServlet("/req/cservlet")
public class CServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        final String referer = request.getHeader("Referer");
        //这就获取到了访问的来源
        System.out.println("referer = " + referer);
        //可以获取他的IP之类的一通操作

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值