更换request请求参数

文章目录


在项目中不同服务之间调用经常会使用加密,这时我们需要在控制层先解密再执行对应的业务逻辑,所以我在想可不可以使用Filter先解密,控制器直接拿到的是解密后的请求参数呢

此时需要使用HttpServletRequestWrapper类,因为HttpServletRequest中的getParameterMap获取到的map上了锁,直接更改会报错

java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap 

所以我们使用装饰者模式使用HttpServletRequestWrapper来更换请求,达到更换请求参数的目的。首先创建一个类继承HttpServletRequestWrapper:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;

public class ParameterRequestWrapper extends HttpServletRequestWrapper {
    private Map params;

    public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
        super(request);
        this.params = newParams;
    }

    public Map getParameterMap() {
        return params;
    }

    public Enumeration getParameterNames() {
        Vector l = new Vector(params.keySet());
        return l.elements();
    }

    public String[] getParameterValues(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            return (String[]) v;
        } else if (v instanceof String) {
            return new String[] { (String) v };
        } else {
            return new String[] { v.toString() };
        }
    }

    public String getParameter(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            String[] strArr = (String[]) v;
            if (strArr.length > 0) {
                return strArr[0];
            } else {
                return null;
            }
        } else if (v instanceof String) {
            return (String) v;
        } else {
            return v.toString();
        }
    }
}

然后在自己使用的过滤器中使用该对象更换原请求对象

///解密后的操作
 HashMap m = new HashMap(request.getParameterMap());
 m.put(***)//你想更换的参数
  ParameterRequestWrapper parameterRequestWrapper = new ParameterRequestWrapper((HttpServletRequest)request,m);
                request = parameterRequestWrapper;
                super.doFilter(request, response, chain);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你遇到了无法提交request请求的问题,可能是由于以下原因: 1. 网络连接问题:请检查你的网络连接是否正常,尝试重新连接网络或更改网络环境。 2. 请求地址错误:请确认请求地址是否正确,可尝试在浏览器中手动请求该地址,看是否能够正常返回数据。 3. 请求参数错误:请检查请求参数是否正确,例如请求方法、请求头、请求体等。 4. 服务器故障:如果以上都没问题,可能是服务器出现故障,请联系服务器管理员进行处理。 如果以上方法都无法解决问题,建议尝试使用其他工具或编程语言进行请求,或者联系API提供商寻求帮助。 ### 回答2: 当请求提交不了时,可能有以下几个原因: 1. 服务器问题:服务器可能出现故障或者过载,导致无法处理请求。如果是这种情况,我们只能等待服务器恢复正常。 2. 网络问题:网络连接可能存在问题,例如断网、网络延迟过高等,导致无法将请求发送到服务器。我们可以通过检查网络连接或者更换网络环境来解决这个问题。 3. 请求格式错误:如果请求的格式错误,服务器可能无法正确解析请求。我们可以检查请求的数据是否按照规定的格式进行填写,包括请求头、请求方法、URL等。 4. 权限问题:某些接口可能需要特定的权限才能访问,如果我们没有足够的权限,服务器会拒绝我们的请求。我们可以联系管理员或者申请相应的权限来解决这个问题。 5. 客户端问题:我们使用的请求工具或者浏览器可能存在问题,例如版本过旧、缓存导致的冲突等。我们可以尝试清除缓存、更新工具或者使用其他工具来提交请求。 总的来说,请求提交不了可能是由于服务器、网络、请求格式、权限或者客户端等问题导致的。我们可以通过排查这些可能的原因,并逐个解决来解决这个问题。如果无法解决,我们可以联系服务器管理员或者开发人员以获取帮助。 ### 回答3: 当我们在网页中填写完表单内容后,点击提交按钮时,实际上是触发了一个请求request),将我们填写的数据发送给后台服务器进行处理。然后服务器会根据该请求进行相应的处理并返回结果给我们。 如果请求提交不了,可能存在以下几种问题: 1.网络连接问题:首先需要检查自己的网络连接是否正常。可以尝试重新连接网络或者刷新网页重试。 2.服务器问题:如果网络连接正常,但是请求依然提交不了,可能是服务器出现了一些问题。此时可以尝试联系网站管理员或开发人员,询问服务器是否正常运行。 3.表单验证失败:有些表单提交时需要通过一些验证规则才能提交成功。可能是我们填写的内容不符合验证规则,导致提交失败。此时可以仔细检查填写的内容,确保符合表单要求。 4.浏览器兼容性:不同的浏览器对于网页的解析方式可能略有不同,有些浏览器可能无法正确解析某些表单或提交按钮的功能。此时可以尝试使用其他浏览器,或者更新当前使用的浏览器版本。 总之,请求提交不成功可能是由于网络连接问题、服务器问题、表单验证失败或者浏览器兼容性等原因导致。如果遇到该问题,可以根据具体情况进行排查和解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值