HttpServletRequest 详解

HttpServletRequest 详解

HttpServletRequest 是 Java Servlet API 中处理 HTTP 请求的核心接口,它扩展了 ServletRequest 接口,提供了 HTTP 协议特有的功能。


一、HttpServletRequest 核心功能

1. 请求信息获取

  • 基础信息

    String method = request.getMethod(); // GET/POST/PUT等
    String protocol = request.getProtocol(); // HTTP/1.1
    String scheme = request.getScheme(); // http/https
    String serverName = request.getServerName(); // 主机名
    int serverPort = request.getServerPort(); // 端口号
    String contextPath = request.getContextPath(); // 应用上下文路径
    String servletPath = request.getServletPath(); // Servlet路径
    String pathInfo = request.getPathInfo(); // 额外路径信息
    
  • URL 信息

    StringBuffer requestURL = request.getRequestURL(); // 完整URL
    String requestURI = request.getRequestURI(); // 去掉协议和主机的URI
    String queryString = request.getQueryString(); // 查询字符串
    

2. 请求头操作

// 获取单个请求头
String userAgent = request.getHeader("User-Agent");

// 获取所有请求头名
Enumeration<String> headerNames = request.getHeaderNames();

// 获取多个同名的请求头值
Enumeration<String> headers = request.getHeaders("Accept-Encoding");

// 获取日期型请求头
long date = request.getDateHeader("If-Modified-Since");

3. 请求参数获取

// 获取单个参数值
String username = request.getParameter("username");

// 获取多个同名参数值
String[] hobbies = request.getParameterValues("hobby");

// 获取所有参数名
Enumeration<String> paramNames = request.getParameterNames();

// 获取参数Map
Map<String, String[]> paramMap = request.getParameterMap();

4. 属性操作(请求作用域)

// 设置属性
request.setAttribute("currentUser", user);

// 获取属性
User user = (User) request.getAttribute("currentUser");

// 移除属性
request.removeAttribute("currentUser");

// 获取所有属性名
Enumeration<String> attrs = request.getAttributeNames();

二、高级功能

1. 会话管理

// 获取现有会话或创建新会话
HttpSession session = request.getSession(); 

// 只获取现有会话(不创建新会话)
HttpSession existingSession = request.getSession(false);

// 检查请求是否包含会话ID
boolean requestedSessionIdValid = request.isRequestedSessionIdValid();

2. Cookie 操作

// 获取所有Cookie
Cookie[] cookies = request.getCookies();

// 查找特定Cookie
Optional<Cookie> authCookie = Arrays.stream(request.getCookies())
    .filter(c -> "authToken".equals(c.getName()))
    .findFirst();

3. 多部分请求处理(文件上传)

if (ServletFileUpload.isMultipartContent(request)) {
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<FileItem> items = upload.parseRequest(request);
    // 处理上传文件...
}

4. 请求分发

// 内部转发
RequestDispatcher dispatcher = request.getRequestDispatcher("/otherServlet");
dispatcher.forward(request, response);

// 包含其他资源
RequestDispatcher dispatcher = request.getRequestDispatcher("/header.jsp");
dispatcher.include(request, response);

三、实际应用示例

1. RESTful 参数处理

@WebServlet("/api/users/*")
public class UserApiServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        String pathInfo = req.getPathInfo(); // 如 "/123"
        String[] parts = pathInfo.split("/");
        if (parts.length > 1) {
            String userId = parts[1]; // 获取ID
            // 查询用户信息...
        }
    }
}

2. 请求日志拦截器

public class LoggingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        HttpServletRequest request = (HttpServletRequest) req;
        
        String requestInfo = String.format(
            "%s %s from %s",
            request.getMethod(),
            request.getRequestURI(),
            request.getRemoteAddr()
        );
        
        System.out.println("Request: " + requestInfo);
        chain.doFilter(req, res);
    }
}

3. 移动设备检测

public boolean isMobileDevice(HttpServletRequest request) {
    String userAgent = request.getHeader("User-Agent");
    String[] mobileKeywords = {
        "Mobile", "Android", "iPhone", "iPad", "Windows Phone"
    };
    
    for (String keyword : mobileKeywords) {
        if (userAgent.contains(keyword)) {
            return true;
        }
    }
    return false;
}

四、注意事项

  1. 参数编码

    // 在获取参数前设置编码
    request.setCharacterEncoding("UTF-8");
    
  2. 输入流限制

    • getInputStream()getReader() 只能调用一次
    • 调用后请求参数将不可用
  3. 线程安全

    • HttpServletRequest 对象只在当前请求线程中有效
    • 不要尝试在多线程中共享请求对象
  4. 属性作用域

    • 请求属性只在当前请求范围内有效
    • 转发后属性仍然可用,重定向后属性丢失

五、新特性(Servlet 3.0+)

1. 异步处理

AsyncContext asyncContext = request.startAsync();
asyncContext.start(() -> {
    // 长时间处理
    asyncContext.complete();
});

2. 文件上传简化

Part filePart = request.getPart("file");
String fileName = filePart.getSubmittedFileName();
filePart.write("/uploads/" + fileName);
内容概要:本文档详细介绍了基于直驱永磁同步发电机(PMSG)的1.5MW风力发电系统在Simulink环境下的建模与仿真全过程,涵盖了风力机空气动力学模型、PMSG电磁特性建模、不可控整流与逆变电路、直流环节、空间矢量脉宽调制(SVPWM)技术以及核心控制策略的设计。重点实现了最大功率点跟踪(MPPT)控制以提升风能捕获效率,并构建了电压外环与电流内环协同工作的双闭环控制系统,通过仿真验证了系统在不同风速条件下稳定运行的能力及动态响应性能。; 适合人群:适用于具备电力系统、电机控制理论基础及Simulink仿真操作经验的研究生、科研人员和从事新能源发电系统开发的工程技术人员;特别适合正在进行风电系统建模、控制算法研究或完成相关毕业设计的专业人士。; 使用场景及目标:①深入理解直驱式PMSG风力发电系统的整体架构与工作机理;②掌握从物理部件建模到控制策略实现的完整Simulink仿真流程;③学习并复现MPPT控制、双闭环控制等关键技术方案;④为后续开展低电压穿越、并网稳定性分析、故障诊断等高级课题提供可靠的仿真平台支撑。; 阅读建议:建议结合Matlab/Simulink软件动手实践,逐模块搭建模型,重点关注各控制环节的参数设计与调试方法,同时可参照文中提供的其他风电相关资源进行拓展学习与对比分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值