Хранить и получать доступ к объектам "извне" в Spring Boot - PullRequest
0 голосов
/ 03 июня 2018

У меня есть HandlerInteceptor:

public class RequestInterceptor implements HandlerInterceptor {

@Autowired
private AddressService addressservice

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String ip_address = request.getRemoteAddr();
    addressservice.storeIp_address(ip_address);
    return true;
}
}

Объект:

public class IpAddress {
private String ip_address;

public String getIp_address() {
    return ip_address;
}

public IpAddress setIp_address(String ip_address) {
    this.ip_address = ip_address;
    return this;
}
}

Сервис:

@Service
public class AddressService {
private IpAddress ipAddress;

public void storeIpAddress(String ip_address){
    ipAddress.setIp_address(ip_address);
}

public void getIpAddress(){
    ipAddress.getIp_address();
}}

Теперь, как можно сохранить IP-адрес вдругой объект, чтобы я мог получить к нему доступ при следующем перехвате запроса?Я пытался использовать @Service и т. Д., Но я всегда получаю исключения nullpointer.Я не могу понять, как работает Spring-Boot.Для меня это похоже на ракетостроение.

ОБНОВЛЕНИЕ:

@Service
public class AccessService {
    private Map<String, LocalDateTime> access = new HashMap<>();

    public Map getAccess() {
        return access;
    }

    public void addAccess(String ip_address, LocalDateTime date) {
        access.put(ip_address, date);
    }
}

Перехватчик:

public class RequestInterceptor implements HandlerInterceptor {

@Autowired
private AccessService accessService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(accessService.getAccess().values());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        LocalDateTime datetime = LocalDateTime.now();
        accessService.addAccess(request.getRemoteAddr(), datetime);
        System.out.println(accessService.getAccess());
    }
}

Я все еще получаю исключения Nullpointer ..

ОБНОВЛЕНИЕ2 Я наконец заставил это работать:

    public class RequestInterceptor implements HandlerInterceptor {

    private Map<String, LocalDateTime> access = new HashMap<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ip_address = request.getRemoteAddr();
        for (String key : access.keySet()){
            if (access.get(key).plusSeconds(5).isBefore(LocalDateTime.now())){
                access.remove(key);
            }
        }
        if (access.containsKey(ip_address) == true){
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        access.put(request.getRemoteAddr(), LocalDateTime.now());
    }
}

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

В вашем классе обслуживания объект для класса IpAddress не инициализирован.Так что выбрасываю нулевой указатель на метод установки.

Я должен был также попросить трассировку стека.Моя вина !!: P

Хорошо ... !!

Решение:

@Service
public class AddressService {
private IpAddress ipAddress = new IpAddress();

public void storeIpAddress(String ip_address){
    ipAddress.setIp_address(ip_address);
}

public void getIpAddress(){
    ipAddress.getIp_address();
}}

ОБНОВЛЕНИЕ

Одна серьезная проблема этого подхода заключается в том, что вы получите тот же объектснова и снова, где в качестве класса POJO (например, IpAddress) всегда должен быть новый объект (если не требуется).

Кроме того, похоже, что вы ИСПОЛЬЗУЕТЕ службуpattern.

Я имею в виду, это просто объект String в вашем классе POJO, так почему вы делаете из него POJO.

** POJO: Простой старый объект Java.

0 голосов
/ 03 июня 2018

Вы можете сделать это, сохранив объект в области видимости сеанса и получить значение в любом месте.

HttpSession session = request.getSession();
session.setAttribute("ip_address",ip_address);

и использовать его в следующий раз, используя getAttribute ().

HttpSession session = request.getSession();
 String ip_address = session.getAttribute("ip_address");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...