Skip to content

Instantly share code, notes, and snippets.

@vinnom
Created November 29, 2019 19:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vinnom/c553595ab00d0f494a8e4c11d7501ed9 to your computer and use it in GitHub Desktop.
Save vinnom/c553595ab00d0f494a8e4c11d7501ed9 to your computer and use it in GitHub Desktop.
Pedindo Login no Finalizar Compra
package br.com.alura.springmvc.conf;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.guava.GuavaCacheManager;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.datetime.DateFormatterRegistrar;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import com.google.common.cache.CacheBuilder;
import br.com.alura.springmvc.controllers.HomeController;
import br.com.alura.springmvc.daos.ProdutoDAO;
import br.com.alura.springmvc.infra.GravadorDeArquivos;
import br.com.alura.springmvc.models.CarrinhoCompras;
/*
* AppWebConfig
* Classe que define as configurações do Servlet
*
* */
@EnableWebMvc // Permite a configuração do MVC
@ComponentScan(basePackageClasses = { HomeController.class, ProdutoDAO.class, GravadorDeArquivos.class,
CarrinhoCompras.class }) // Quais são as Classes a serem gerenciadas
@EnableCaching
//public class AppWebConfig implements WebMvcConfigurer {
public class AppWebConfig extends WebMvcConfigurerAdapter {
@Bean // Objeto instanciado e gerenciado pelo Spring
public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposedContextBeanNames("carrinhoCompras");
return resolver;
} // método que manipula prefixos e sufixos das Views
@Bean
public ViewResolver contentNegotiationViewResolver(ContentNegotiationManager manager) {
List<ViewResolver> viewResolvers = new ArrayList<>();
viewResolvers.add(internalResourceViewResolver());
viewResolvers.add(new JsonViewResolver());
ContentNegotiatingViewResolver viewResolver = new ContentNegotiatingViewResolver();
viewResolver.setViewResolvers(viewResolvers);
viewResolver.setContentNegotiationManager(manager);
return viewResolver;
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("/WEB-INF/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(1);
return messageSource;
} // método que configura a fonte de mensagens e seu comportamento
@Bean
public FormattingConversionService mvcConversionService() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
DateFormatterRegistrar registrar = new DateFormatterRegistrar();
registrar.setFormatter(new DateFormatter("dd/MM/yyyy"));
registrar.registerFormatters(conversionService);
return conversionService;
} // método que registra o formato padrão de data
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
} // método que cria e configura o Resolver do Multipart
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
} // método que configura o RestTemplate
@Bean
public CacheManager cacheManager() {
CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(1,
TimeUnit.MINUTES);
GuavaCacheManager cacheManager = new GuavaCacheManager();
cacheManager.setCacheBuilder(builder);
return cacheManager;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
}
@Bean
public LocaleResolver localeResolver() {
return new CookieLocaleResolver();
}
@Bean
public MailSender mailSender() {
JavaMailSenderImpl mailSenderImpl = new JavaMailSenderImpl();
mailSenderImpl.setHost("smtp.gmail.com");
mailSenderImpl.setUsername("alura.springmvc@gmail.com");
mailSenderImpl.setPassword("alura2015");
mailSenderImpl.setPort(587);
mailSenderImpl.setJavaMailProperties(mailProperties());
return mailSenderImpl;
}
private Properties mailProperties() {
Properties mailProperties = new Properties();
mailProperties.put("mail.smtp.auth", true);
mailProperties.put("mail.smpt.starttls.enable", true);
return mailProperties;
}
}
package br.com.alura.springmvc.controllers;
import java.util.concurrent.Callable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import br.com.alura.springmvc.models.CarrinhoCompras;
import br.com.alura.springmvc.models.DadosPagamento;
import br.com.alura.springmvc.models.Usuario;
@Controller
@RequestMapping("/pagamento")
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class PagamentoController {
@Autowired
private CarrinhoCompras carrinho;
@Autowired
private RestTemplate restTemplate;
@Autowired
private MailSender sender;
@RequestMapping(value = "/finaliza", method = RequestMethod.POST)
public Callable<ModelAndView> finaliza(RedirectAttributes model, @AuthenticationPrincipal Usuario usuario) {
return () -> {
String uri = "http://book-payment.herokuapp.com/payment";
try {
String respString = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotalCompra()),
String.class);
enviaEmailConfirmacao(usuario);
model.addFlashAttribute("sucesso", respString);
return new ModelAndView("redirect:/produtos/listaProduto");
} catch (Exception e) {
e.printStackTrace();
model.addFlashAttribute("falha", "Valor maior que o permitido");
return new ModelAndView("redirect:/produtos/listaProduto");
}
};
}
private void enviaEmailConfirmacao(Usuario usuario) {
SimpleMailMessage mail = new SimpleMailMessage();
mail.setSubject("Compra realizada com sucesso");
mail.setTo(usuario.getEmail());
mail.setText("Compra aprovada com sucesso no valor de " + carrinho.getTotalCompra());
mail.setFrom("compras@casadocodigo.com.br");
sender.send(mail);
}
}
package br.com.alura.springmvc.conf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import br.com.alura.springmvc.daos.UsuarioDAO;
@EnableWebSecurity
public class SegurancaConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UsuarioDAO dao;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/produtos/cadastraProdutoForm").hasRole("ADMIN")
.antMatchers("/produtos/listaProduto").hasRole("ADMIN")
.antMatchers("/produtos/**").permitAll()
.antMatchers("/carrinho/**").permitAll()
.antMatchers("/resources/**").permitAll()
.antMatchers("/pagamento/**").permitAll()
.antMatchers("/").permitAll()
.anyRequest().permitAll()
.and().formLogin().loginPage("/login")
.defaultSuccessUrl("/produtos/listaProdutos").permitAll()
.and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).permitAll()
.logoutSuccessUrl("/login");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(dao).passwordEncoder(new BCryptPasswordEncoder());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment