HttpServletRequest入参校验方法

本文介绍了一个用于处理HTTP请求的工具类,包括将请求转换为HashMap、校验必要参数及清理字符串等功能。通过该工具可以简化对请求数据的操作,并增强代码的安全性和健壮性。
package com.tiger.common;

import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.regex.Pattern;

/**
 * HttpRequest的转换类
 */
public class RequestUtil {

    private static Pattern filePattern = Pattern.compile("[/./.\\\\/:,<>+\"^]");


    /**
     * 将HttpServletRequest转换为HashMap形式
     * 重名参数只取第一个
     *
     * @param request
     * @return
     */
    public static HashMap<String, String> convert2Map(HttpServletRequest request) {
        HashMap<String, String> map = new HashMap<String, String>();


        Enumeration<String> names = request.getParameterNames();
        while (names.hasMoreElements()) {
            String key = names.nextElement();
            String value = RequestUtil.replaceChar(request.getParameter(key));
            if (StringUtils.isBlank(value)) {
                continue;
            }
            map.put(key, value);
        }


        return map;
    }

    /**
     * 校验参数中需要检查的key
     *
     * @param request
     * @return 需要验证的key,但是在request中没有找到的
     */
    public static String checkParamKey(HttpServletRequest request, String... keys) {
        StringBuffer buffer = null;
        if (keys.length > 0) {
            Enumeration<String> names = request.getParameterNames();
            ArrayList<String> paramKeyList = Collections.list(names);
            for (String keyNeed : keys) {
                if (!paramKeyList.contains(keyNeed)) {
                    if (null == buffer) {
                        buffer = new StringBuffer();
                        buffer.append(keyNeed);
                        continue;
                    }
                    buffer.append(", ").append(keyNeed);
                }
            }
        }
        return null == buffer ? null : buffer.toString();
    }


    public static String replaceChar(String value) {
        if (null == value || "".equals(value)) {
            return null;
        }
        if (value.indexOf("\r") != -1) {
            value = value.replaceAll("\r", "");
        }
        if (value.indexOf("\n") != -1) {
            value = value.replaceAll("\n", "");
        }
        if (value.indexOf("%0a") != -1) {
            value = value.replaceAll("%0a", "");
        }
        if (value.indexOf("%0d") != -1) {
            value = value.replaceAll("%0d", "");
        }
        return value;
    }


    /**
     * 替换文件路径中的非法字符
     * 如:/ \ + ^ : , .. 等
     *
     * @param value
     * @return
     */
    public static String replaceIllegalChar(String value) {
        if (null == value || "".equals(value)) {
            return null;
        }
        return filePattern.matcher(value).replaceAll("");
    }
}

 

<think>嗯,用户想知道如何从HttpServletRequest中获取token。首先,我需要回忆一下HttpServletRequest的相关方法。通常,token会放在HTTP请求的头部,比如Authorization字段。常见的做法是使用Bearer Token,格式是"Bearer <token>"。所以,用户可能需要从Authorization头中提取token。 不过,也有可能token会被放在其他地方,比如URL参数或者请求体里,但URL参数不太安全,一般不建议。所以重点应该放在请求头。首先,应该检查请求头中的Authorization字段是否存在,然后解析它的值。需要处理可能的前缀,比如Bearer后面可能有空格,需要分割字符串获取实际的token值。 另外,用户可能会遇到没有Authorization头的情况,这时候可能需要返回错误或者进行其他处理。代码示例的话,应该用Java,因为HttpServletRequestJava EE的一部分。需要提醒用户注意空指针异常,比如getHeader可能返回null,所以要先检查是否为null,再进行split操作。 还有,如果用户使用了不同的认证方案,比如直接将token放在自定义的头部,比如X-Auth-Token,那方法也是一样的,只是字段名不同。这时候可能需要提示用户根据实际情况调整字段名称。 此外,要考虑到可能有多个地方存放token的情况,比如同时检查头部和参数,但通常推荐使用头部。安全性方面,URL参数可能会被日志记录,泄露token,所以最好只用头部。 最后,给出一个完整的代码示例,展示如何从Authorization头中提取Bearer Token,并处理可能的异常情况,比如格式不正确或者没有token的情况。这样用户可以直接复制代码并根据自己的情况调整。</think>从HttpServletRequest中获取token的步骤如下: 1. 确定token存放位置(常见位置): - 请求头Authorization字段(最常用) - URL参数(如?token=xxx) - Cookie中 2. 推荐优先检查请求头的实现方式: ```java public String getTokenFromRequest(HttpServletRequest request) { // 1. 从Authorization头获取 String authHeader = request.getHeader("Authorization"); if (authHeader != null && authHeader.startsWith("Bearer ")) { return authHeader.substring(7); // 去掉"Bearer "前缀 } // 2. 如果头不存在,尝试从URL参数获取 String tokenParam = request.getParameter("token"); if (tokenParam != null && !tokenParam.isEmpty()) { return tokenParam; } // 3. 最后检查Cookie(需要根据具体名称) Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("auth_token".equals(cookie.getName())) { return cookie.getValue(); } } } return null; // 未找到token } ``` 3. 安全建议: $$注意:优先使用Authorization头方式,URL参数方式可能被日志记录导致泄露$$ - 建议使用标准Bearer Token格式:`Authorization: Bearer <token>` - 校验token是否存在且有效: ```java String token = getTokenFromRequest(request); if (token == null || token.isBlank()) { throw new AuthenticationException("Missing authentication token"); } ``` 4. 扩展场景处理: - 如果使用自定义头(如X-Auth-Token): ```java String token = request.getHeader("X-Auth-Token"); ``` - 如果使用JWT格式需要解码验证: $$建议使用专业的JWT库(如jjwt)进行验证$$ 5. 完整验证流程建议: ``` 1. 获取token -> 2. 校验格式 -> 3. 验证签名(JWT)-> 4. 检查过期时间 -> 5. 授权验证 ``` 请根据实际使用的认证方案(Bearer Token、JWT、OAuth2等)调整具体实现细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值