Es ist eine Feder Boot-Anwendung, habe ich AOP http Kopf zu fangen, kann body.I für @annotation etwas tun, wenn Fang Wert von http Kopf, Körper.Allerdings, wenn ich tranfer Daten zu meinen kundengebundenen Parametern, kann ich nicht bekommen. aber eine andere Federbootanwendung kann es übertragen. Ich weiß nicht warum.Frühling AOP kann nicht übertragen Wert angepasst Parameter
dies wird besonders angefertigt @Aspect:
@Component
@Aspect
public class ApiAspect {
@Resource
private HttpServletRequest request;
@Around("@annotation(com.jvbaoji.api.common.ApiAuth)")
public Object aroundAdvice(ProceedingJoinPoint point) throws Throwable {
Long userId = Optional.ofNullable(request.getHeader("user_id")).map(Long::valueOf).orElse(null);
final MethodSignature signature = (MethodSignature) point.getSignature();
final Method method = signature.getMethod();
final String methodName = method.getName();
final Class<?>[] parameterTypes = method.getParameterTypes();
final Annotation[][] parameterAnnotations;
parameterAnnotations = point.getTarget().getClass().getMethod(methodName, parameterTypes).getParameterAnnotations();
final Object[] args = point.getArgs();
for (int i = 0; i < args.length; i++) {
for (Annotation annotation : parameterAnnotations[i]) {
if (AuthUserId.class.equals(annotation.annotationType())) {
args[i] = userId;
break;
}
}
}
return point.proceed();
}
}
angepasst @interface:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiAuth {
}
Parameter:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthUserId {
}
Controller:
@RequestMapping(value = "updateAccount", method = RequestMethod.POST)
@ApiAuth
public JsonNode updateAccount(@AuthUserId Long userId, @ModelAttribute UserAccountVO userAccountVO) {
userAccountVO.setUserId(userId);
TransmissionResult result = userWalletService.updateAccount(userAccountVO);
if (!result.isSuccess()) {
return responseJsonFactory.createBad(result.getCode(), result.getFailReason());
}
return responseJsonFactory.createOk(jsonMapper.convertValue(userAccountVO, JsonNode.class));
}
Ich habe gefunden, wenn ich http, kann ich debuggen zu arg[i]=userId
, aber um point.proceed()
zurückgeben, wirft es eine NullException.My @AuthUserId Long userId
kann nicht erhalten Wert. Ich weiß nicht warum.
ps: Mein Frühling AOP-Version ist feder AOP-4.1.4.RELEASE.jar im Frühjahr Boot.
Dank, was Beratung Wenn Sie geben.
Genau so, wie Sie richtig zu verstehen, bevor er antwortete: a) Sie sind sich der Tatsache bewusst, dass der Aspekt ein Singleton ist und damit die eingespritzte Anfrage wird immer gleich sein? b) Nach dem, was ich sehe, ist mein Eindruck, dass der Zweck des Aspekts darin besteht, Benutzerautorisierung zu hacken. Dann hoffe ich, dass Sie rechtliche Gründe dafür haben. Können Sie das bitte kurz kommentieren? – kriegaex
NoNoNo.It ist meine Anwendung, ich weiß nicht, wie man Benutzerautorisierung hackt. Ich bekomme nur userId in meiner Anwendung für mein Projekt.jedoch bekomme ich immer noch keine. – Hanawa