当前位置: 首页 > 知识库问答 >
问题:

如何在403 http状态下拦截来自REST API的响应,在Spring类AuthenticationProvider中

沈成天
2023-03-14

我有以下问题:我自定义了Spring boot提供的SortagenationProvider类,以调用rest服务,以便在远程服务器上登录

如果凭据正确,没问题。

当凭据不正确,并且服务器响应http状态为403时,问题就会出现。实际上,我得不到响应,因为它自动引发了API rest的一个异常:

ResponseEntity <UserResponse> resp = restTemplate.exchange (url, HttpMethod.POST, requestEntity, UserResponse.class);

我尝试创建自定义类,用@ControllerAdvice注释捕获异常,但是无法调用它,因为异常不是在控制器中出现,而是在AuthenticationProvider类中出现。

是否有方法拦截rest API异常的响应?

public class CustomAuthenticationProvider implements AuthenticationProvider {

private static final Logger log = LoggerFactory.getLogger(CustomAuthenticationProvider.class);

@Value("${search.login}")
private String searchLogin;

@Autowired
private HttpServletRequest request;

private DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    User user=new User();
    ObjectWriter ow = new ObjectMapper().writer();
    String json="log-> ";
    UserResponse response=new UserResponse();
    try {

                RestTemplate restTemplate = new RestTemplate();
                URI url;
                url = new URI(searchLogin);
                MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
                map.add("username",URLEncoder.encode(authentication.getName(), "utf-8"));
                map.add("password",URLEncoder.encode(authentication.getCredentials().toString(), "utf-8"));
                HttpHeaders requestHeaders = new HttpHeaders();
                requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
                List<MediaType> acceptableMediaTypes=new ArrayList<MediaType>();
                acceptableMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
                requestHeaders.setAccept(acceptableMediaTypes);
                HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(map,requestHeaders);
                ResponseEntity<UserResponse> resp = restTemplate.exchange(url, HttpMethod.POST, requestEntity, UserResponse.class);
                response = resp.getBody();

提前感谢。

共有2个答案

葛俊
2023-03-14

您可以尝试在Rest中添加@ExceptionHandler。就像例如< code > @ Exception handler public String exp(http servlet request,Exception ex){ < br >//balabala }

张亦
2023-03-14

恐怕您必须从Spring Security处理它,因为@ControllerAdvice只拦截直接从您的控制器抛出的异常。我想这个链接会给你你正在寻找的解决方案。

 类似资料:
  • 问题内容: 如何在axios中设置获取响应的状态? 问题答案: 您在这里遇到语法错误。你应该试试这个 这里有几件事要注意: 是一个异步函数,这意味着其余代码将被执行。当服务器的响应到达时,传递给的函数将被执行。的返回值称为承诺对象。您可以在此处了解更多信息 关键字根据调用的位置而具有不同的值。in 应该 引用构造函数对象,并且在函数内部调用时,它引用该对象。这就是为什么我分配给变量的原因。您可以在

  • 这里是我的拦截器方法,我想在这里设置自定义响应,告诉UI发生了什么 并且在web.xml中 spring-servlet.xml 当会话超时时,它在返回false后不发送任何响应。连下面的都不行

  • 我们正在将AngularJS应用程序迁移到最新的Angular版本。我们总是通过接收状态代码200来处理http请求,如果有错误,我们仍然得到状态代码200(不包括404-500,以及关于实际服务器或用户连接的错误)。例如,如果用户令牌过期,我们发出请求,我们将得到一个状态代码200,其主体为errorcode:number,message:string。这是不会改变的。 使用关于令牌的相同示例,

  • 问题内容: 主题行基本上说明了一切。我有一个静态方法要拦截,以便可以将周围的建议应用于该方法。我可以使它与任何非静态方法一起使用,但是我不确定如何允许静态方法被拦截。 问题答案: 使用Spring AOP不能做到这一点,因为它是基于代理的。您必须使用AspectJ。看一个简单的例子:http : //blog.jayway.com/2007/02/16/static-mock-using- asp

  • 问题内容: 我看到 一吨 的条目在我的Tomcat日志(样品粘贴下面)。这些在几个月前进行次要版本升级(Spring Security 4.2.4,IIRC)后开始出现在我的日志文件中,因此,这显然是默认情况下启用的Spring新安全功能。这里报告了类似的问题,但是我的问题专门涉及如何在控制器中拦截这些异常。有一个针对此问题的Spring Security错误记录(提供一种处理RequestRej

  • 我在Tomcat日志中看到大量条目(示例粘贴在下面)。在几个月前的一次小版本升级(Spring Security 4.2.4,IIRC)后,这些功能开始出现在我的日志文件中,因此这显然是Spring中默认启用的一个新的安全特性。这里报告了一个类似的问题,但我的问题具体涉及如何在控制器中拦截这些异常。这个问题有一个Spring Securitybug(提供一种处理RequestRejectedExc