相关疑难解决方法(0)

弹簧过滤器的异常处理

我使用@ExceptionHandler在spring中处理异常.使用@ExceptionHandler注释的方法捕获控制器抛出的任何异常,并相应地采取操作.为了避免为我使用@ControllerAdvice注释的每个控制器编写@exceptionHandler.

一切都按预期工作正常.

现在我有一个过滤器(是的,不是拦截器,以处理某些要求),它是使用DelegatingFilterProxy和ContextLoaderListener实现的.

当我从上面的过滤器中抛出相同的异常时,它没有像在控制器情况下那样完成.它直接抛给用户.

这里有什么问题?

spring exception-handling spring-mvc

11
推荐指数
2
解决办法
1万
查看次数

使用@ControllerAdvice使简单的servlet过滤器工作

我有一个简单的过滤器,只是为了检查一个请求是否包含一个带有静态密钥的特殊标头 - 没有用户身份验证 - 只是为了保护端点.我的想法是抛出一个AccessForbiddenException如果密钥不匹配的密钥,然后将其映射到带有注释的类的响应@ControllerAdvice.但是我不能让它发挥作用.我@ExceptionHandler没被打电话.

ClientKeyFilter

import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Controller

import javax.servlet.*
import javax.servlet.http.HttpServletRequest

@Controller //I know that @Component might be here
public class ClientKeyFilter implements Filter {

  @Value('${CLIENT_KEY}')
  String clientKey

  public void init(FilterConfig filterConfig) {}

  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
    req = (HttpServletRequest) req
    def reqClientKey = req.getHeader('Client-Key')
    if (!clientKey.equals(reqClientKey)) {
      throw new AccessForbiddenException('Invalid API key')
    }
    chain.doFilter(req, res)
  }

  public void destroy() {}
}
Run Code Online (Sandbox Code Playgroud)

AccessForbiddenException

public class AccessForbiddenException …
Run Code Online (Sandbox Code Playgroud)

spring exception-handling filter spring-security spring-boot

11
推荐指数
2
解决办法
5986
查看次数

如何处理Filters中抛出的异常?

我使用的是Spring 4和Tomcat.问题是有时我必须在我的过滤器中抛出(自定义)RuntimeException(控件甚至没有到达控制器).问题是因为我没有抛出tomcat理解的异常,它被转换为500(内部服务器错误).我相信403 Forbidden会比500更好(对于我的自定义例外).我看过@ExceptionHandler@ControllerAdvice注释.但这些只有在控制器到达控制器时才起作用.

截至目前,我HTTPResponse在我的过滤器中手动将状态设置为403 .有没有更好的方法来处理这种情况?

java spring tomcat spring-mvc

11
推荐指数
1
解决办法
2788
查看次数

如何处理spring rest API上的内部服务器错误(500)?

美好的一天,

我正在做春季休息api,我想确保一切正常.我想记录异常行为,如nullPointerException或数据库连接错误或任何可能引发或未处理或未假设的异常.

我想捕获任何未处理的异常并向用户显示漂亮的消息,而不是打印堆栈跟踪.

为此我在互联网上找到了一个扩展ResponseEntityExceptionHandler并覆盖handleExceptionInternal方法的解决方案.

我还想记录404错误,看看是否有人试图攻击我的服务器.

我还在属性文件中添加了这一行:spring.mvc.throw-exception-if-no-handler-found = true

这是handleExceptionInternal的代码

@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {

    GenericResponse response = new GenericResponse();
    response.setMessage("Internal error occured, " + ex.getStackTrace()[0]);

    System.out.println("big exceptions");

    return new ResponseEntity(response, headers, status);

}
Run Code Online (Sandbox Code Playgroud)

我的问题是当我传递错误的路由像/ abc这个代码运行正常,但是当我从控制器方法抛出空指针异常时,这个方法没有捕获它.

谢谢.

java rest spring spring-mvc

11
推荐指数
1
解决办法
2万
查看次数

获取自定义错误控制器中的异常对象

我正在使用 spring boot 并编写一个全局异常处理程序 use AbstractErrorController。我如何在控制器中获取异常对象?

@Controller
public class MyCustomErrorController extends AbstractErrorController {

    public MyCustomErrorController(ErrorAttributes errorAttributes) {
        super(errorAttributes);
    }

    @RequestMapping("/error")
    public void handleError(HttpServletRequest req, HttpServletResponse resp) {
        Exception e = ...; // how to get exception here
        log.error(e);
        displayError(req, resp, e);
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}
Run Code Online (Sandbox Code Playgroud)

spring-boot

7
推荐指数
1
解决办法
3686
查看次数