getRequestURI 和 getQueryString

本文探讨了在不同服务器环境下,如何解决本地与测试环境间使用request.getQueryString()获取URL参数失效的问题,并提供了替代方法。重点强调了在多服务器部署场景下,采用通用、跨环境支持的方法的重要性。

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

request.getRequestURI()      /jqueryWeb/resources/request.jsp
request.getRequestURL()     http://localhost:8080/jqueryWeb/resources/request.jsp
request.getContextPath()      /jqueryWeb
request.getServletPath()       /resources/request.jsp


注: resources为WebContext下的目录名
         jqueryWeb 为工程名

 

request.getQueryString()

       一个用户本地调试时,在jsp文件当中可以通过request.getQueryString()取得网页?以后的参数,但是发布到测试环境后,不能正常运行。

       原因在于本地服务器为Tomcat,而测试环境是Websphere环境。使用request.getQueryString()时,换到Websphere的环境下,forward以后,用getQueryString就无法取到网页?以后的参数,但是可以用request.getAttribute( "javax.servlet.forward.query_string ")来取。
       所以在很多情况下,考虑到需要发布到不同的服务器环境下,一定要采用比较通用的、各种环境都支持的方法实现,以免发布碰到问题。
``` private TransmitTarget generateTransmitTarget(String traceId, HttpServletRequest request) throws JsonProcessingException { String ip = HttpUtils.getRemoteIp(request); String uri = request.getRequestURI().trim(); String queryString = request.getQueryString(); String method = request.getMethod(); Quadruple quadruple = HttpUtils.apiLocationMetadata(traceId, uri, queryString); String configuration = redisClient.get(RedisUtils.apiConfigKey(quadruple.getNamespace(), quadruple.getAction(), quadruple.getVersion())); InterfaceConfig interfaceConfig = new InterfaceConfig(); if (configuration != null) { interfaceConfig = JsonUtils.getObjectMapper().readValue(configuration, InterfaceConfig.class); } else { // 接口配置为空时,检查接口是否注册,刷新注册接口,并标记未注册接口 checkApiRegisterStatus(traceId, quadruple, interfaceConfig); } SentinelUtils.initFlowRules(quadruple.getNamespace(), flowLimitConfig.getMaps().getOrDefault(quadruple.getNamespace(), flowLimitConfig.getDefaultQps())); try (Entry ignored = SphU.entry(quadruple.getNamespace())) { businessConfig.refuseBlockList(traceId, interfaceConfig.getInterfaceType(), ip); if (interfaceConfig.getHttpMethod() == null || !interfaceConfig.getHttpMethod().equalsIgnoreCase(method) || !interfaceConfig.getHttpMethod().toUpperCase(Locale.ROOT).contains(method)) { throw new MethodNotAllowedException(traceId, RespCode.METHOD_NOT_ALLOWED); } Map<String, String> headers = HttpUtils.obtainHeaders(traceId, request, ip); this.authenticate(traceId, interfaceConfig, headers); return TransmitTarget.builder().cbResourceName(StringUtils.obtainServiceName(interfaceConfig.getServerAddress())).uri(HttpUtils.generateUrl(interfaceConfig.getServerAddress(), interfaceConfig.getRealPath(), quadruple.getQueryString())).headers(headers).build(); } catch (BlockException e) { Logger.outerRequestError(this.getClass().getName(), "generateTransmitTarget", String.format("trace_id:%s, resource_name: %s rate limited, action: %s", traceId, quadruple.getNamespace(), quadruple.getAction()), e); throw new ServerBusyException(traceId, RespCode.SERVER_BUSY); } }```解释该代码段
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值