开发者社区 问答 正文

RequestContext类自动编码和tomcat的 URIEncoding冲突问题

今天在Fitler中使用了 RequestContext 对request进行了自动编码,然后测试http get 方式传递中文参数,发现 RequestProxy 中的参数编码和 Tomcat 中配置的 URIEncoding=“UTF-8” 冲突了:
如果Tomcat 不配置 URIEncoding,则Get方式传递中文木有问题;
但是如果Tomcat配置了URIEncoding,则Get方式传递中文是乱码;
有没有办法可以让 RequestProxy 和 URIEncoding 两者同时存在啊?或者是否可以获取到 Tomcat 中配置的 URIEncoding 参数值?求大牛指点一下。

展开
收起
落地花开啦 2016-03-25 11:46:40 3451 分享 版权
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    可以通过JMX取,不用开JMX的远程访问也能行。端口你考虑从request里面应该是能取出来的。

    /**
     * 返回Tomcat设置在server.xml的Connector上的URIEncoding属性值,如果无法获取或没有设置返回null
     * 
     * @param port
     *            HTTP监听端口,用于对应Connector
     * <a href="http://my.oschina.net/u/556800" class="referer" target="_blank">@return</a> 
     */
    public static String getConnectorURIEncoding(int port) {
        String result = null;
        // 获取当前环境下的JMX MBeanServer,Tomcat启动的时候会创建一个(通常环境下也只有一个MBeanServer)
        List<MBeanServer> serverList = MBeanServerFactory.findMBeanServer(null);
        // 遍历MBeanServer找到要的MBean及对应的属性
        for (MBeanServer server : serverList) {
            // 获取MBean
            try {
                result = (String) server.getAttribute(ObjectName.getInstance("Catalina:type=Connector,port=" + port), "URIEncoding");
            } catch (AttributeNotFoundException e) { // 指定的属性在 MBean中是不可访问的
                // Do Nothing
            } catch (InstanceNotFoundException e) { // 指定的 MBean未注册
                // Do Nothing
            } catch (MBeanException e) {
                log.warning("MBeanException: " + e.getMessage());
            } catch (ReflectionException e) {
                log.warning("ReflectionException: " + e.getMessage());
            } catch (MalformedObjectNameException e) {
                log.warning("MalformedObjectNameException: " + e.getMessage());
            }
     
            if (result != null) { // 拿到值就跳出
                break;
            }
        }
     
        return result;
    }
    2019-07-17 19:14:04
    赞同 展开评论