我在生产中遇到了很多错误
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.
据说这是由我的网址中的//
引起的,但是我不知道它们来自何处。我怎么知道是什么URL造成的?当您不知道发生了什么时很难修复。
我确实意识到有一个相关的question,但这没有解决如何诊断问题URL。它只解决了如何关闭严格的防火墙。
答案 0 :(得分:0)
很抱歉没有将此内容发布为评论,但我还不能这样做。
您是否尝试过另一个日志记录级别并记录到文件?我现在不在家,但如果不尝试这些话:
logging.level.=ERROR
logging.file=/home/spring.log
也许还可以尝试 DEBUG 作为日志记录级别
为什么(尽管有点怪异)尝试将每个//
换成/
作为第三个选择,我找到了此脚本,您可能会使其运行。
@ExceptionHandler(RequestRejectedException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleRequestRejectedException(final HttpServletRequest request, final RequestRejectedException ex)
{
if (LOGGER.isLoggable(Level.INFO))
{
LOGGER.log(Level.INFO, "Request Rejected", ex);
}
LOGGER.log(Level.WARNING, "Rejected request for [" + request.getRequestURL().toString() + "]. Reason: " + ex.getMessage());
return "errorPage";
}
祝你好运,如果你不成功,我明天就会回来。
答案 1 :(得分:0)
HttpFirewall
将从一开始就在FilterChainProxy
中检查请求,甚至在调用SecurityFilterChain
中的任何过滤器之前也是如此。因此,最好的选择是在Filter
前面放置一个FilterChainProxy
,并使用此Filter
来捕获RequestRejectedException
并记录其详细信息。
(1)实现一个捕获此异常的过滤器:
public class LogFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
if( e instanceof RequestRejectedException ) {
logger.info("Catch RequestRejectedException....");
logger.info((HttpServletRequest)request).getRequestURI()); //log the request detail such as its URI
}
throw e;
}
}
}
(2)配置并注册过滤器
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new LogFilter());
registration.addUrlPatterns("/*");
registration.setOrder(RegistrationBean.HIGHEST_PRECEDENCE); //Must has higher precedence than FilterChainProxy
return registration;
}
答案 2 :(得分:0)
我的问题是我有一个使用 Spring Security 的配置,并且还在控制器类上启用了 @CrossOrigin Annotation,下面是我刚刚添加到我的配置方法中的内容。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
http.cors(); //Only this
}
}
您也可以在此处查看以供参考:https://www.baeldung.com/spring-cors