Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package mypack.conf;
- import java.time.LocalDateTime;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.UUID;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.Lazy;
- import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
- import org.springframework.http.HttpCookie;
- import org.springframework.http.ResponseCookie;
- import org.springframework.web.reactive.config.ResourceHandlerRegistry;
- import org.springframework.web.reactive.config.WebFluxConfigurer;
- import org.springframework.web.server.ServerWebExchange;
- import org.springframework.web.server.WebFilter;
- import org.springframework.web.server.WebFilterChain;
- import mypack.dao.PageViewRepository;
- import mypack.dao.UserRepository;
- import mypack.domain.PageView;
- import mypack.domain.User;
- import mypack.security.JwtProvider;
- import reactor.core.publisher.Mono;
- @Configuration
- @ComponentScan(basePackages = "mypack")
- @EnableReactiveMongoRepositories(basePackages = "mypack")
- public class WebConfig implements WebFluxConfigurer {
- @Autowired
- @Lazy
- private UserRepository userRepository;
- @Autowired
- @Lazy
- private PageViewRepository pageViewRepository;
- @Autowired
- @Lazy
- JwtProvider jwtProvider;
- @Bean
- public WebFilter sampleWebFilter() {
- return new WebFilter() {
- @Override
- public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
- String uri = exchange.getRequest().getURI().toString();
- String path = exchange.getRequest().getPath().pathWithinApplication().value();
- HttpCookie cookie = null;
- String token = "";
- Map<String, List<HttpCookie>> cookies = exchange.getRequest().getCookies();
- try {
- if((exchange.getRequest().getCookies().containsKey("_token") )
- && (exchange.getRequest().getCookies().getFirst("_token"))!=null ) {
- cookie = exchange.getRequest().getCookies().getFirst("_token");
- token = cookie.getValue();
- return userRepository.findByToken(token).map(user -> {
- exchange.getAttributes().put("_token", user.getToken());
- PageView pg = PageView.builder().createdDate(LocalDateTime.now()).URL(uri).build();
- pageViewRepository.save(pg).subscribe(pg1 -> {user.getPageviews().add(pg1); });
- userRepository.save(user).subscribe();
- return user;
- })
- .flatMap(user-> chain.filter(exchange)); // ultimately this step executes regardless user exist or not
- // handle case when brand new user first time visits website
- } else {
- token = jwtProvider.genToken("guest", UUID.randomUUID().toString());
- User user = User.builder().createdDate(LocalDateTime.now()).token(token).emailId("guest").build();
- userRepository.save(user).subscribe();
- exchange.getResponse().getCookies().remove("_token");
- ResponseCookie rcookie = ResponseCookie.from("_token", token).httpOnly(true).build();
- exchange.getResponse().addCookie(rcookie);
- exchange.getAttributes().put("_token", token);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return chain.filter(exchange);
- } // end of Mono<Void> filter method
- }; // end of New WebFilter (anonymous class)
- }
- }
- @Repository
- public interface PageViewRepository extends ReactiveMongoRepository<PageView, String>{
- Mono<PageView> findById(String id);
- }
- @Repository
- public interface UserRepository extends ReactiveMongoRepository<User, String>{
- Mono<User> findByToken(String token);
- }
- @Data
- @AllArgsConstructor
- @Builder
- @NoArgsConstructor
- public class User {
- @Id
- private String id;
- private String token;
- @Default
- private LocalDateTime createdDate = LocalDateTime.now();
- @DBRef
- private List<PageView> pageviews;
- }
- Data
- @Document
- @Builder
- public class PageView {
- @Id
- private String id;
- private String URL;
- @Default
- private LocalDateTime createdDate = LocalDateTime.now();
- }
Add Comment
Please, Sign In to add comment