春季-更改全局错误处理程序和过滤器的顺序

时间:2018-09-12 19:55:03

标签: spring spring-boot

我有一个类似的过滤器:

<?php
  if (isset($_POST['submit_btn']))
{
@$username = $_POST['username'];
@$password = $_POST['password'];
@$cpassword = $_POST['cpassword'];
@$email = $_POST['email'];
if ($password == $cpassword)
    {
    $query = "SELECT * FROM signin WHERE username = '$username'";
    $query_run = mysqli_query($con,$query);
    if ($query_run)
        {
            if (mysqli_num_rows($query_run)>0)
            {
                echo '<script type="text/javascript">alert("This Username Already exists.. Please try another username!")</script>';
            }
            else{
                $query = "INSERT INTO `signin`(`username`, `password`, `email`) VALUES ('$username','$password','$email')";
                $query_run = mysqli_query($con, $query);

                    if ($query_run)
                        {
                            echo '<script type="text/javascript">alert("User Registered succesfully")</script>';
                        }
                      else
                        {
                            echo '<script type="text/javascript">alert("Registration Unsuccessful due to server error. Please try later")</script>';
                        }
                    }
            }
            else
                {
                    echo '<script type="text/javascript">alert("DB error")</script>';
                }
        }   
    else
            {
                echo '<script type="text/javascript">alert("Password and Confirm Password do not match")</script>';
            }
}
?>

我注意到在过滤器之后调用了全局异常处理程序,我认为这就是为什么响应在过滤器中为空白的原因。有没有办法在全局异常处理程序之后调用过滤器?

1 个答案:

答案 0 :(得分:-1)

编辑:

TLDR

否您不能按照OP标题更改顺序,因为GlobalError Handler始终位于保存ControllerAdvices的层中,并且始终位于RequestFilter层和Controller之间。

长版

您说得对。

我推荐您这个答案:https://stackoverflow.com/a/17716298/405749

对此进行扩展:

  • 请注意,之前和之后取决于您所查找的对象,即。
    • 入站(在到达您的控制器代码之前)或
    • 出站(完成控制器后)
  • 现在您可以在此路径上插入不同的组件,例如这里RequestFilter和控制器建议
  • 根据您实现的方法,仅在入站或出站轨道或同时在这两个轨道上调用它:
    • doFilterInternal()被称为入站。仅当您调用filterChain.doFilter(request, response);时,请求才继续在入站轨道上运行,否则将在此处停止,并且返回的响应将返回其输出流中已存在的内容,或者将被此过滤器添加或在出路时仍然遇到过滤器< / li>
  • 这是调用序列,假设我们只有此过滤器和建议
    1. 请求过滤器的“入站”方法
    2. 控制器建议中的“入站”方法
    3. 控制器建议中的“出站”方法
    4. 请求过滤器的“出站”方法

现在,handleArgNotValid()仅在抛出这样的异常的情况下被调用,并有可能将内容添加到Response-Output流中。您的示例未显示是否在此处返回对象,但是从您的OP中我猜您没有。结果输出流为空。

Plz还请注意,没有简单的方法可以将输出流转储/查找到输出流中,除非您将其包装,但这是另一个主题。