diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index feca861..0000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.gitignore b/.gitignore
index d1c4e3c..3290dd5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-# Compiled class file
+#/ Compiled class file
*.class
/target/
diff --git a/pom.xml b/pom.xml
index 629e236..c3dc3ee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,24 @@
3.8.1
test
+
+ org.springframework.security
+ spring-security-config
+ 4.1.1.RELEASE
+ compile
+
+
+
+ org.springframework.security
+ spring-security-web
+ 4.1.1.RELEASE
+ compile
+
+
+ log4j
+ log4j
+ 1.2.17
+
diff --git a/src/.DS_Store b/src/.DS_Store
deleted file mode 100644
index 7b0d367..0000000
Binary files a/src/.DS_Store and /dev/null differ
diff --git a/src/main/.DS_Store b/src/main/.DS_Store
deleted file mode 100644
index 5ddc54c..0000000
Binary files a/src/main/.DS_Store and /dev/null differ
diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store
deleted file mode 100644
index 35a54bf..0000000
Binary files a/src/main/java/.DS_Store and /dev/null differ
diff --git a/src/main/java/com/.DS_Store b/src/main/java/com/.DS_Store
deleted file mode 100644
index 6ffafc6..0000000
Binary files a/src/main/java/com/.DS_Store and /dev/null differ
diff --git a/src/main/java/com/packt/.DS_Store b/src/main/java/com/packt/.DS_Store
deleted file mode 100644
index d262ee4..0000000
Binary files a/src/main/java/com/packt/.DS_Store and /dev/null differ
diff --git a/src/main/java/com/packt/webstore/config/LoginController.java b/src/main/java/com/packt/webstore/config/LoginController.java
new file mode 100644
index 0000000..23067ea
--- /dev/null
+++ b/src/main/java/com/packt/webstore/config/LoginController.java
@@ -0,0 +1,17 @@
+package com.packt.webstore.config;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * ログインコントローラー
+ * @author hirooka
+ */
+@Controller
+public class LoginController {
+ @RequestMapping(value = "/login", method = RequestMethod.GET)
+ public String login(){
+ return "login";
+ }
+}
diff --git a/src/main/java/com/packt/webstore/config/SecurityConfig.java b/src/main/java/com/packt/webstore/config/SecurityConfig.java
new file mode 100644
index 0000000..150882b
--- /dev/null
+++ b/src/main/java/com/packt/webstore/config/SecurityConfig.java
@@ -0,0 +1,61 @@
+package com.packt.webstore.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+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;
+
+
+/**
+ * ログインの設定
+ * ログインされていない場合これらの設定に従って動作する。
+ * @author hirooka
+ */
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ //ユーザーの登録
+ @Autowired
+ public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
+ auth.inMemoryAuthentication().withUser("john").password("pa55word").roles("USER");
+ auth.inMemoryAuthentication().withUser("admin").password("root123").roles("USER", "ADMIN");
+ }
+
+
+ /**
+ * 認証のさいのいろいろな設定
+ *
+ * @param httpSecurity
+ * @throws Exception
+ */
+ @Override
+ public void configure(HttpSecurity httpSecurity) throws Exception {
+
+ //認証がされていないときに呼び出される。
+ //ここで呼び出すページはコントローラーの中で呼び出されるページと同じ
+ httpSecurity.formLogin().loginPage("/login")
+ .usernameParameter("userId")
+ .passwordParameter("password");
+
+ httpSecurity.formLogin().defaultSuccessUrl("/market/products/add")
+ .failureUrl("/login?error");
+
+ //ログアウトが成功した際のページ呼び出し
+ httpSecurity.logout().logoutSuccessUrl("/login?logout");
+
+ //許可されていないページへ入った際に呼び出される。
+ httpSecurity.exceptionHandling().accessDeniedPage("/login?accessDenied");
+
+ //ロールによってredirectするページを変更する。
+ httpSecurity.authorizeRequests()
+ .antMatchers("/").permitAll()
+ .antMatchers("/**/add").access("hasRole('ADMIN')")
+ .antMatchers("/**/market/**").access("hasRole('USER')");
+
+ //
+ httpSecurity.csrf().disable();
+ }
+}
diff --git a/src/main/java/com/packt/webstore/config/SecurityWebApplicationInitializer.java b/src/main/java/com/packt/webstore/config/SecurityWebApplicationInitializer.java
new file mode 100644
index 0000000..b33b871
--- /dev/null
+++ b/src/main/java/com/packt/webstore/config/SecurityWebApplicationInitializer.java
@@ -0,0 +1,13 @@
+package com.packt.webstore.config;
+
+import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
+
+/**
+ * Spring起動の際にSpring側にセキュリティログインの設定があることを知らせるためのクラス
+ *
+ * @author hirooka
+ *
+ */
+public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
+
+}
diff --git a/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java b/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java
index 24b8068..16d12d4 100644
--- a/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java
+++ b/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java
@@ -1,18 +1,19 @@
package com.packt.webstore.config;
+import com.packt.webstore.intercepter.ProcessingTimeLogInterceptor;
+import com.packt.webstore.intercepter.PromoCodeInterceptor;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
+import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.util.UrlPathHelper;
-import java.util.ResourceBundle;
-
@Configuration
@EnableWebMvc
@ComponentScan("com.packt.webstore")
@@ -47,6 +48,16 @@ public MessageSource messageSource(){
return resource;
}
+ @Bean
+ public HandlerInterceptor promoCodeInterceptor(){
+ PromoCodeInterceptor promoCodeInterceptor = new PromoCodeInterceptor();
+ promoCodeInterceptor.setPromoCode("OFF3R");
+ promoCodeInterceptor.setOfferRedirect("/market/products");
+ promoCodeInterceptor.setErrorRedirect("invalidPromoCode");
+ return promoCodeInterceptor;
+ }
+
+
/**
* HandlerMappingの設定
*
@@ -58,4 +69,15 @@ public void configurePathMatch(PathMatchConfigurer configurer) {
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
+
+ /**
+ * インターセプターの設定
+ * @param registry
+ */
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new ProcessingTimeLogInterceptor());
+ registry.addInterceptor(promoCodeInterceptor())
+ .addPathPatterns("/**/market/products/specialOffer");
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/packt/webstore/controller/ProductController.java b/src/main/java/com/packt/webstore/controller/ProductController.java
index 978017b..a2d2162 100644
--- a/src/main/java/com/packt/webstore/controller/ProductController.java
+++ b/src/main/java/com/packt/webstore/controller/ProductController.java
@@ -1,7 +1,6 @@
package com.packt.webstore.controller;
import com.packt.webstore.domain.Product;
-import com.packt.webstore.domain.repository.ProductRepository;
import com.packt.webstore.exeption.NoProductsFoundUnderCategoryException;
import com.packt.webstore.exeption.ProductNotFoundException;
import com.packt.webstore.service.ProductService;
@@ -16,8 +15,6 @@
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.xml.ws.RequestWrapper;
import java.util.List;
import java.util.Map;
@@ -86,7 +83,12 @@ public String processAddNewProductForm(@ModelAttribute("newProduct") Product new
return "redirect:/market/products";
}
+ @RequestMapping("/products/invalidPromoCode")
+ public String invalidPromoCode(){
+ return "invalidPromoCode";
+ }
+ @InitBinder
public void initialiseBinder(WebDataBinder binder) {
binder.setAllowedFields("productId",
"name",
@@ -108,6 +110,4 @@ public ModelAndView handleError(HttpServletRequest request,
mav.setViewName("productNotFound");
return mav;
}
-
-
}
diff --git a/src/main/java/com/packt/webstore/intercepter/ProcessingTimeLogInterceptor.java b/src/main/java/com/packt/webstore/intercepter/ProcessingTimeLogInterceptor.java
new file mode 100644
index 0000000..0436657
--- /dev/null
+++ b/src/main/java/com/packt/webstore/intercepter/ProcessingTimeLogInterceptor.java
@@ -0,0 +1,43 @@
+package com.packt.webstore.intercepter;
+
+import org.apache.log4j.Logger;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * インターセプターの追加
+ * レスポンス速度を測る。
+ * @author hirooka
+ */
+public class ProcessingTimeLogInterceptor implements HandlerInterceptor {
+
+ private static final Logger LOGGER = Logger.getLogger(ProcessingTimeLogInterceptor.class);
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
+ Object o) throws Exception {
+ long startTime = System.currentTimeMillis();
+ request.setAttribute("startTime", startTime);
+ return true;
+ }
+
+ @Override
+ public void postHandle(HttpServletRequest request, HttpServletResponse response,
+ Object o, ModelAndView modelAndView) throws Exception {
+ String queryString = request.getQueryString() == null ? "" : "?" + request.getQueryString();
+ String path = request.getRequestURL() + queryString;
+ long startTime = (Long) request.getAttribute("startTime");
+ long endTime = System.currentTimeMillis();
+ LOGGER.info(String.format("%s millisecond taken to process the request %s", (endTime - startTime), path));
+
+ }
+
+ @Override
+ public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
+ Object o, Exception e) throws Exception {
+ //nop
+ }
+}
diff --git a/src/main/java/com/packt/webstore/intercepter/PromoCodeInterceptor.java b/src/main/java/com/packt/webstore/intercepter/PromoCodeInterceptor.java
new file mode 100644
index 0000000..dd98bab
--- /dev/null
+++ b/src/main/java/com/packt/webstore/intercepter/PromoCodeInterceptor.java
@@ -0,0 +1,41 @@
+package com.packt.webstore.intercepter;
+
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class PromoCodeInterceptor extends HandlerInterceptorAdapter {
+ private String promoCode;
+ private String errorRedirect;
+ private String offerRedirect;
+
+ public PromoCodeInterceptor() {
+ super();
+ }
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
+ Object handler) throws Exception {
+ String givenPromoCode = request.getParameter("promo");
+ if (promoCode.equals(givenPromoCode)) {
+ response.sendRedirect(request.getContextPath() + "/" + offerRedirect);
+ } else {
+ response.sendRedirect(errorRedirect);
+ }
+ return false;
+ }
+
+ public void setPromoCode(String promoCode) {
+ this.promoCode = promoCode;
+ }
+
+ public void setErrorRedirect(String errorRedirect) {
+ this.errorRedirect = errorRedirect;
+ }
+
+ public void setOfferRedirect(String offerRedirect) {
+ this.offerRedirect = offerRedirect;
+ }
+}
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
new file mode 100644
index 0000000..6799911
--- /dev/null
+++ b/src/main/resources/log4j.properties
@@ -0,0 +1,14 @@
+# Root logger option
+log4j.rootLogger=INFO, file, stdout
+# Direct log messages to a log file
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=/Users/hirookayuukana/Desktop/log/performance.log
+log4j.appender.file.MaxFileSize=1MB
+log4j.appender.file.MaxBackupIndex=1
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss} %-5p %c{1}:%L - %m%n
+# Direct log messages to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/addProduct.jsp b/src/main/webapp/WEB-INF/views/addProduct.jsp
index 51cd9ea..bf26b90 100644
--- a/src/main/webapp/WEB-INF/views/addProduct.jsp
+++ b/src/main/webapp/WEB-INF/views/addProduct.jsp
@@ -9,6 +9,12 @@
Products
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/invalidPromoCode.jsp b/src/main/webapp/WEB-INF/views/invalidPromoCode.jsp
new file mode 100644
index 0000000..2cedcd7
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/invalidPromoCode.jsp
@@ -0,0 +1,29 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+
+
+
+
+
+
Invalid promo code
+
+
+
+
+
+
Invalid Promo Code
+
+
+
+
+
+
+ "
+ class="btn btn-primary">
+
+ products
+
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/views/login.jsp b/src/main/webapp/WEB-INF/views/login.jsp
new file mode 100644
index 0000000..8ec2ace
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/login.jsp
@@ -0,0 +1,66 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+
+<%@ taglib prefix="spring"
+ uri="http://www.springframework.org/tags" %>
+
+
+
+
+
+
Products
+
+
+
+
+
+
Welcome to Web Store!
+
The one and only amazing web store
+
+
+
+
+
\ No newline at end of file