From c3428d4056805a57e8ff85bc0507da396d9e2296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Tue, 18 Dec 2018 17:23:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0springmvc=20=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E3=80=81=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=99=A8=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring/springmvc-base-annotation/README.md | 1 - .../com/heibaiying/config/ServletConfig.java | 24 ++++++++++++++++- .../controller/HelloController.java | 7 +++++ .../heibaiying/exception/NoAuthException.java | 25 +++++++++++++++++ .../exception/NoAuthExceptionResolver.java | 26 ++++++++++++++++++ .../interceptors/MyFirstInterceptor.java | 27 +++++++++++++++++++ .../interceptors/MySecondInterceptor.java | 27 +++++++++++++++++++ .../main/webapp/WEB-INF/jsp/NoAuthPage.jsp | 9 +++++++ spring/springmvc-base/pom.xml | 16 +++++++++++ .../controller/HelloController.java | 8 ++++++ .../heibaiying/exception/NoAuthException.java | 25 +++++++++++++++++ .../exception/NoAuthExceptionResolver.java | 26 ++++++++++++++++++ .../interceptors/MyFirstInterceptor.java | 27 +++++++++++++++++++ .../interceptors/MySecondInterceptor.java | 27 +++++++++++++++++++ .../src/main/resources/springApplication.xml | 17 ++++++++++++ .../main/webapp/WEB-INF/jsp/NoAuthPage.jsp | 9 +++++++ 16 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthException.java create mode 100644 spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java create mode 100644 spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java create mode 100644 spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java create mode 100644 spring/springmvc-base-annotation/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp create mode 100644 spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthException.java create mode 100644 spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java create mode 100644 spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java create mode 100644 spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java create mode 100644 spring/springmvc-base/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp diff --git a/spring/springmvc-base-annotation/README.md b/spring/springmvc-base-annotation/README.md index 27531fa..e69de29 100644 --- a/spring/springmvc-base-annotation/README.md +++ b/spring/springmvc-base-annotation/README.md @@ -1 +0,0 @@ -springmvc-base-annotation \ No newline at end of file diff --git a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/config/ServletConfig.java b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/config/ServletConfig.java index 460bc87..4af28a0 100644 --- a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/config/ServletConfig.java +++ b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/config/ServletConfig.java @@ -1,14 +1,21 @@ package com.heibaiying.config; +import com.heibaiying.exception.NoAuthExceptionResolver; +import com.heibaiying.interceptors.MyFirstInterceptor; +import com.heibaiying.interceptors.MySecondInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.InternalResourceViewResolver; +import java.util.List; + /** * @author : heibaiying */ @@ -32,8 +39,23 @@ public class ServletConfig implements WebMvcConfigurer { /** * 配置静态资源处理器 */ - public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } + + /** + * 添加自定义拦截器 + */ + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new MyFirstInterceptor()).addPathPatterns("/mvc/**").excludePathPatterns("mvc/login"); + registry.addInterceptor(new MySecondInterceptor()).addPathPatterns("/mvc/**"); + } + + + /** + * 添加全局异常处理器 + */ + public void configureHandlerExceptionResolvers(List resolvers) { + resolvers.add(new NoAuthExceptionResolver()); + } } diff --git a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/controller/HelloController.java b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/controller/HelloController.java index 43bfb23..2341710 100644 --- a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/controller/HelloController.java +++ b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/controller/HelloController.java @@ -1,5 +1,6 @@ package com.heibaiying.controller; +import com.heibaiying.exception.NoAuthException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -16,4 +17,10 @@ public class HelloController { private String hello() { return "hello"; } + + + @RequestMapping("auth") + private void auth() { + throw new NoAuthException("没有对应的访问权限!"); + } } diff --git a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthException.java b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthException.java new file mode 100644 index 0000000..82aad62 --- /dev/null +++ b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthException.java @@ -0,0 +1,25 @@ +package com.heibaiying.exception; + +/** + * @author : heibaiying + * @description : 自定义无权限异常 + */ +public class NoAuthException extends RuntimeException { + + public NoAuthException() { + super(); + } + + public NoAuthException(String message) { + super(message); + } + + public NoAuthException(String message, Throwable cause) { + super(message, cause); + } + + public NoAuthException(Throwable cause) { + super(cause); + } + +} diff --git a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java new file mode 100644 index 0000000..fc88beb --- /dev/null +++ b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java @@ -0,0 +1,26 @@ +package com.heibaiying.exception; + +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author : heibaiying + * @description : 无权限异常处理机制 + */ +public class NoAuthExceptionResolver implements HandlerExceptionResolver { + + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + if (ex instanceof NoAuthException && !isAjax(request)) { + return new ModelAndView("NoAuthPage"); + } + return new ModelAndView(); + } + + // 判断是否是Ajax请求 + private boolean isAjax(HttpServletRequest request) { + return "XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With")); + } +} diff --git a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java new file mode 100644 index 0000000..a4765bf --- /dev/null +++ b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java @@ -0,0 +1,27 @@ +package com.heibaiying.interceptors; + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author : heibaiying + * @description : spring5 中 preHandle,postHandle,afterCompletion 在接口中被声明为默认方法 + */ +public class MyFirstInterceptor implements HandlerInterceptor { + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + System.out.println("进入第一个拦截器preHandle"); + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { + System.out.println("进入第一个拦截器postHandle"); + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + System.out.println("进入第一个拦截器afterCompletion"); + } +} diff --git a/spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java new file mode 100644 index 0000000..b3e980e --- /dev/null +++ b/spring/springmvc-base-annotation/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java @@ -0,0 +1,27 @@ +package com.heibaiying.interceptors; + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author : heibaiying + * @description : spring5 中 preHandle,postHandle,afterCompletion 在接口中被声明为默认方法 + */ +public class MySecondInterceptor implements HandlerInterceptor { + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + System.out.println("进入第二个拦截器preHandle"); + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { + System.out.println("进入第二个拦截器postHandle"); + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + System.out.println("进入第二个拦截器afterCompletion"); + } +} diff --git a/spring/springmvc-base-annotation/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp b/spring/springmvc-base-annotation/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp new file mode 100644 index 0000000..6f8fa59 --- /dev/null +++ b/spring/springmvc-base-annotation/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp @@ -0,0 +1,9 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + + 没有对应的访问权限! + + \ No newline at end of file diff --git a/spring/springmvc-base/pom.xml b/spring/springmvc-base/pom.xml index 11fc763..ffeb4ac 100644 --- a/spring/springmvc-base/pom.xml +++ b/spring/springmvc-base/pom.xml @@ -39,6 +39,22 @@ spring-webmvc ${spring-base-version} + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + com.alibaba + fastjson + 1.2.54 + + + com.google.guava + guava + 27.0.1-jre + \ No newline at end of file diff --git a/spring/springmvc-base/src/main/java/com/heibaiying/controller/HelloController.java b/spring/springmvc-base/src/main/java/com/heibaiying/controller/HelloController.java index 43bfb23..12ab9b1 100644 --- a/spring/springmvc-base/src/main/java/com/heibaiying/controller/HelloController.java +++ b/spring/springmvc-base/src/main/java/com/heibaiying/controller/HelloController.java @@ -1,8 +1,10 @@ package com.heibaiying.controller; +import com.heibaiying.exception.NoAuthException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; + /** * @author : heibaiying * @description : hello spring @@ -16,4 +18,10 @@ public class HelloController { private String hello() { return "hello"; } + + + @RequestMapping("auth") + private void auth() { + throw new NoAuthException("没有对应的访问权限!"); + } } diff --git a/spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthException.java b/spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthException.java new file mode 100644 index 0000000..82aad62 --- /dev/null +++ b/spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthException.java @@ -0,0 +1,25 @@ +package com.heibaiying.exception; + +/** + * @author : heibaiying + * @description : 自定义无权限异常 + */ +public class NoAuthException extends RuntimeException { + + public NoAuthException() { + super(); + } + + public NoAuthException(String message) { + super(message); + } + + public NoAuthException(String message, Throwable cause) { + super(message, cause); + } + + public NoAuthException(Throwable cause) { + super(cause); + } + +} diff --git a/spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java b/spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java new file mode 100644 index 0000000..fc88beb --- /dev/null +++ b/spring/springmvc-base/src/main/java/com/heibaiying/exception/NoAuthExceptionResolver.java @@ -0,0 +1,26 @@ +package com.heibaiying.exception; + +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author : heibaiying + * @description : 无权限异常处理机制 + */ +public class NoAuthExceptionResolver implements HandlerExceptionResolver { + + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + if (ex instanceof NoAuthException && !isAjax(request)) { + return new ModelAndView("NoAuthPage"); + } + return new ModelAndView(); + } + + // 判断是否是Ajax请求 + private boolean isAjax(HttpServletRequest request) { + return "XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With")); + } +} diff --git a/spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java b/spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java new file mode 100644 index 0000000..a4765bf --- /dev/null +++ b/spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MyFirstInterceptor.java @@ -0,0 +1,27 @@ +package com.heibaiying.interceptors; + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author : heibaiying + * @description : spring5 中 preHandle,postHandle,afterCompletion 在接口中被声明为默认方法 + */ +public class MyFirstInterceptor implements HandlerInterceptor { + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + System.out.println("进入第一个拦截器preHandle"); + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { + System.out.println("进入第一个拦截器postHandle"); + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + System.out.println("进入第一个拦截器afterCompletion"); + } +} diff --git a/spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java b/spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java new file mode 100644 index 0000000..b3e980e --- /dev/null +++ b/spring/springmvc-base/src/main/java/com/heibaiying/interceptors/MySecondInterceptor.java @@ -0,0 +1,27 @@ +package com.heibaiying.interceptors; + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author : heibaiying + * @description : spring5 中 preHandle,postHandle,afterCompletion 在接口中被声明为默认方法 + */ +public class MySecondInterceptor implements HandlerInterceptor { + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + System.out.println("进入第二个拦截器preHandle"); + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { + System.out.println("进入第二个拦截器postHandle"); + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + System.out.println("进入第二个拦截器afterCompletion"); + } +} diff --git a/spring/springmvc-base/src/main/resources/springApplication.xml b/spring/springmvc-base/src/main/resources/springApplication.xml index 9a3da85..f8392f0 100644 --- a/spring/springmvc-base/src/main/resources/springApplication.xml +++ b/spring/springmvc-base/src/main/resources/springApplication.xml @@ -24,4 +24,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring/springmvc-base/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp b/spring/springmvc-base/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp new file mode 100644 index 0000000..6f8fa59 --- /dev/null +++ b/spring/springmvc-base/src/main/webapp/WEB-INF/jsp/NoAuthPage.jsp @@ -0,0 +1,9 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + + 没有对应的访问权限! + + \ No newline at end of file