15.SSM框架集~SpringMVC拦截器
本文是上一篇文章的后续,详情点击该链接
拦截器
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等
拦截器和过滤器的区别
过滤器针对的是所有的请求,拦截器主要针对的是控制单元。过滤器基于技术是Servlet,拦截器是SpringMVC提供,拦截器可以看作是细化的过滤器,用拦截器可以实现的功能,过滤器几乎都可以实现。但是过滤器可以实现的功能,拦截器不一定可以实现。
拦截器 | 过滤器 |
拦截器不依赖与servlet容器 | 过滤器依赖与servlet容器 |
拦截器只能对action请求起作用 | 而过滤器则可以对几乎所有的请求起作用 |
拦截器可以访问action上下文、值栈里的对象 | 过滤器不能访问 |
在action的生命周期中,拦截器可以多次被调用 | 过滤器只能在容器初始化时被调用一次 |
拦截器可以获取IOC容器中的各个bean,在拦截器里注入一个service,可以调用业务逻辑。 | 过滤器不怎么行 |
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。
代码实现
本节代码是接第13章的那篇后续配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 定义拦截器配置 -->
<mvc:interceptor>
<mvc:mapping path="/loginUser/"/><!-- 用于指定对拦截的 url -->
<bean id="inter1" class="com.alvin.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
代码实现
public class MyInterceptor implements HandlerInterceptor {
//执行时机:进入控制单元之前执行
//如果方法返回值是true才会继续执行,如果是false 控制单元内容将不会执行
// handler--com.alvin.controller.UserController#login(String, String, HttpServletRequest)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//System.out.println("preHandle"+handler);
//[作用一]进行中post文乱码的处理
request.setCharacterEncoding("utf-8");
//[作用二] 维护页面的跳转
//response.sendRedirect(request.getContentType()+"/wh.jsp");
//[作用三]进行权限校验/登录拦截
return true;
}
//执行的时机:在控制单元中做出相应之前 ,也就是在控制单元中第二步和第三步之间
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//[作用一]响应之前页面跳转的处理
// modelAndView.setViewName("redirect:/success2.jsp");
//[作用二] 对敏感词语进行拦截替换
Map<String, Object> model = modelAndView.getModel();
//取出响应给客户端数据
String msg = (String) model.get("msg");
if(msg.contains("枪支")){
//替换成功以后的字符串
String m2 = msg.replaceAll("棍棒", "**");
model.put("msg",m2);
}
System.out.println("postHandle");
}
//执行的时机:页面渲染后时候
//垃圾回收的处理操作 资源关闭操作
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
SpringMVC中异常处理
系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息, 后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理,如下图
使用@ExceptionHandler注解处理异常
假如我们现在就遇到一个异常,怎么办呢?
解决
//value指向的那个值就是我上面画红线的那个
@ExceptionHandler(value = java.lang.NumberFormatException.class)
public ModelAndView handlerArithmeticException(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/error.jsp");
return modelAndView;
}
@ExceptionHandler源码
如果我们想要全局异常处理,那么我们可以单独创建一个包
//全局异常处理
@ControllerAdvice
public class GloableException {
@ExceptionHandler(value = java.lang.NumberFormatException.class)
public ModelAndView handlerArithmeticException(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/error.jsp");
return modelAndView;
}
}
然后在配置文件里面多扫描一个就好了
<context:component-scan base-package="com.alvin.controller,com.alvin.exception"></context:component-scan>
使用:SimpleMappingExceptionResolver
@Configuration
public class GloableException2 {
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties prop = new Properties();
prop.put("java.lang.NullPointerException","error1");
prop.put("java.lang.ArithmeticException","error2");
resolver.setExceptionMappings(prop);
return resolver;
}
}
自定义HandlerExceptionResolve
@Configuration
public class GloableException3 implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
if(e instanceof NullPointerException){
mv.setViewName("error1");
}
if(e instanceof ArithmeticException){
mv.setViewName("error2");
}
mv.addObject("msg",e);
return mv;
}}