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