春季“由于未规范化URL,请求被拒绝。”如何知道使用了什么网址?

时间:2019-02-02 03:14:45

标签: java spring spring-boot spring-security

我在生产中遇到了很多错误

org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.

据说这是由我的网址中的//引起的,但是我不知道它们来自何处。我怎么知道是什么URL造成的?当您不知道发生了什么时很难修复。

我确实意识到有一个相关的question,但这没有解决如何诊断问题URL。它只解决了如何关闭严格的防火墙。

3 个答案:

答案 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