【发布时间】:2018-12-04 11:25:27
【问题描述】:
我有一个控制器,它以GET 接收请求,带有两个参数e 和p:
@GetMapping("")
public String getIframe(
@RequestParam(value = "p", required = false) String p,
@RequestParam(value = "e", required = false) String e
){
System.out.println("Hi");
}
在某些情况下,e 和 p 值可以包含 {} 字符。
它在 spring-boot 1 中运行良好,但是在将模块更新到 spring-boot 2 后它开始引发异常:
java.net.URISyntaxException: Illegal character in query at index 47: http://127.0.0.1:8080/shorteners/click/RikBV?e={CLICKID}&p={PUBID}
at java.net.URI$Parser.fail(URI.java:2848)
at java.net.URI$Parser.checkChars(URI.java:3021)
at java.net.URI$Parser.parseHierarchical(URI.java:3111)
at java.net.URI$Parser.parse(URI.java:3053)
at java.net.URI.<init>(URI.java:588)
at java.net.URI.create(URI.java:850)
... 45 common frames omitted
Wrapped by: java.lang.IllegalArgumentException: Illegal character in query at index 47: http://127.0.0.1:8080/shorteners/click/RikBV?e={CLICKID}&p={PUBID}
at java.net.URI.create(URI.java:852)
at fr.hamid.testApp.app.configurations.HeadersFilter.doFilter(HeadersFilter.java:43) [26 skipped]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [9 skipped]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [2 skipped]
[1 skipped]
另外,我的过滤器类如下:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class HeadersFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
String referer = request.getHeader("referer") ;
if (referer != null && new UrlValidator().isValid(referer)) {
URL url = new URL(referer);
response.setHeader("Access-Control-Allow-Origin", url.getProtocol() + "://" + url.getHost());
}
else {
response.setHeader("Access-Control-Allow-Origin", "*");
}
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Headers", "x-auth-token, x-requested-with, content-type, accept, " +
"origin, referer, Authorization, customer-user-id, device-os, t-user-id, t-network-cache-capacity," +
"t-network-bandwidth, device-client-date, dev-platform, sdk-version, sdk-type, app-package-name," +
"device-imei, developer-key, device-model, device-os-version, secret-token, t-network-type");
response.setHeader("Access-Control-Expose-Headers", "x-requested-with");
response.setHeader("Access-Control-Allow-Credentials", "true");
if (!"OPTIONS".equals(request.getMethod())) {
//Exception raises here!
chain.doFilter(req, res);
}
response.setHeader("X-Frame-Options", "*");
}
public void init(FilterConfig filterConfig) {
}
public void destroy() {
}
}
当我使用wget 命令时,它运行良好,但是当我使用浏览器调用 url 时出现异常!
有没有办法处理这些类型的网址?
注意:由于客户正在使用这些 url,我无法通过与其他人更改 {} 字符来解决此问题。所以,处理这个服务器端很重要!
非常感谢:)
【问题讨论】:
-
能发一些代码吗?
-
请发布您的控制器代码/
-
您不能使用 PathVariable 代替吗?哪个可以解决您的问题?
-
@JaiDixit 这只是一个简单的控制器。但是,我更新了我的问题并添加了方法。
-
@VelNaga 不幸的是,这个 url 模式已被大量客户使用,我暂时无法更改。
标签: java spring spring-boot