как получить значение String, называемое токеном, из метода, чтобы использовать Spring AOP для написания более короткого кода - PullRequest
0 голосов
/ 09 июля 2020

например, в моем проекте у меня есть класс AdminController, который имеет множество методов с кодом, который повторяется во всех методах и имеет переменную класса, одна из переменных методов + класса:

   private Map<String, OurSession> clientSessions;

    public AdminController(Map<String, OurSession> clientSessions) {
        this.clientSessions = clientSessions;
    }

    @PostMapping("addCompany/{token}")
    public ResponseEntity<?> addCompany(@PathVariable String token, @RequestBody Company company){
        OurSession session = clientSessions.get(token);
        if(session != null){
            AdminFacade admin = (AdminFacade) session.getFacade();
            if(System.currentTimeMillis() - session.getLastAccessed() > 1000 * 60 * 30)
                return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("UNAUTHORIZED login");
            session.setLastAccessed(System.currentTimeMillis());
            try {
                admin.addCompany(company);
                return ResponseEntity.ok(company);
            } catch (CompanyAlreadyExistsException e) {
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
            }
        }else
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("UNAUTHORIZED login");
    }

теперь внутри этого метода весь этот код повторяется во всех методах этого класса:

 OurSession session = clientSessions.get(token);
        if(session != null){
            AdminFacade admin = (AdminFacade) session.getFacade();
            if(System.currentTimeMillis() - session.getLastAccessed() > 1000 * 60 * 30)
                return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("UNAUTHORIZED login");
            session.setLastAccessed(System.currentTimeMillis());

этот код можно вставить в метод AOP другого класса, чтобы помочь мне писать меньше кода:


    @Before("execution(* com.example.couponproject.controller.AdminController*(..) )")
    public void runBefore(JoinPoint joinPoint) {
        code here that repeat itself

    }

, но моя проблема в том, что вы замечаете, что весь метод получает строковое значение, называемое токеном, и я не знаю, как использовать это в методе АОП, как мне отправлять это значение токена каждый раз, когда АОП метод работает?

другими словами, мне нужно, чтобы метод АОП использовал это значение токена из каждого метода контроллера, который вызвал метод АОП

спасибо за помощников!

1 Ответ

0 голосов
/ 10 июля 2020

Предполагая, что все методы класса AdminController имеют String token в качестве первого аргумента, для этой цели можно использовать обозначение args() Pointcut.

Пример кода:

@Before("execution(* com.example.couponproject.controller.AdminController*(..) ) && args(token,..)")
public void runBefore(JoinPoint joinPoint,String token) {
    code here that repeat itself

}

Прочтите раздел Передача параметров в совет для получения дополнительной информации о том же

Спасибо @kriegaex за указание на это (цитируя его комментарий):

Примечание: возможно, класс OP называется AdminController, и он хочет сопоставить все методы в этом классе. Затем он должен использовать .AdminController. , потому что .AdminController будет соответствовать (со странным названием) имени метода, начинающемуся с AdminController, в (также со странным названием) контроллере класса. Я предполагаю, что здесь это не так, поэтому, вероятно, .AdminController. * Это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...