我正在使用springmvc为客户端创建restful api,我有一个用于检查accesstoken的拦截器.
public class AccessTokenInterceptor extends HandlerInterceptorAdapter
{
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception
{
if (handler instanceof HandlerMethod)
{
HandlerMethod handlerMethod = (HandlerMethod) handler;
Authorize authorizerequired = handlerMethod.getMethodAnnotation(Authorize.class);
if (authorizerequired != null)
{
String token = request.getHeader("accesstoken");
ValidateToken(token);
}
}
return true;
}
protected long ValidateToken(String token)
{
AccessToken accessToken = TokenImpl.GetAccessToken(token);
if (accessToken != null)
{
if (accessToken.getExpirationDate().compareTo(new Date()) > 0)
{
throw new TokenExpiredException();
}
return accessToken.getUserId();
}
else
{
throw new InvalidTokenException();
}
}
在我的控制器中,我使用@ExceptionHandler来处理异常,处理InvalidTokenException的代码看起来像
@ExceptionHandler(InvalidTokenException.class)
public @ResponseBody
Response handleInvalidTokenException(InvalidTokenException e)
{
Log.p.debug(e.getMessage());
Response rs = new Response();
rs.setErrorCode(ErrorCode.INVALID_TOKEN);
return rs;
}
但不幸的是,preHandle方法抛出的异常并未被控制器中定义的异常处理程序捕获.
任何人都可以给我一个处理异常的解决方案吗?
PS:我的控制器方法使用以下代码生成json和xml:
@RequestMapping(value = "login",method = RequestMethod.POST,produces =
{
"application/xml","application/json"
})
最佳答案
使用其他方法解决,捕获异常并转发到另一个控制器.
原文链接:https://www.f2er.com/spring/432768.htmltry
{
ValidateToken(token);
} catch (InvalidTokenException ex)
{
request.getRequestDispatcher("/api/error/invalidtoken").forward(request,response);
return false;
} catch (TokenExpiredException ex)
{
request.getRequestDispatcher("/api/error/tokenexpired").forward(request,response);
return false;
}