使用


拦截器使用
先编写一个拦截器类 必须implements HandlerInterceptor(import org.springframework.web.servlet.HandlerInterceptor;)
然后开始根据需求重新方法

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

  • 自定义拦截器
  • 第一步:编写一个普通类型,实现HandlerInterceptor接口。

  • 根据实际需要重写方法,里面有三个方法,需要自己手动重写方法

  • 第二步:配置拦截器。在springmvc.xml中 ,

    • 如果不配置,SpringMVC无法知道这里有个拦截器

*/

public class MyInterceptor1 implements HandlerInterceptor {

  1. /**
  2. * 此方法是拦截器的拦截方法,它在控制器方法执行之前执行。
  3. * 此方法return true的时候表示放行。return false 表示不放行
  4. */
  5. @Override
  6. **public boolean **preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) **throws **Exception {
  7. System.out.println(**"MyInterceptor1.preHandle 执行了"**);
  8. //return false; //不放行
  9. **return true**; //表示放行
  10. }
  11. /**
  12. * 放行之后,控制器方法执行完成之后,此方法执行。
  13. * 它可以对响应的内容进行处理
  14. * 此方法执行时,视图还没有执行。
  15. */
  16. @Override
  17. **public void **postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) **throws **Exception {
  18. System.out.println(**"MyInterceptor1.postHandle执行了"**);
  19. }<br /> /**
  20. * 它是在视图执行完成之后执行。
  21. * 只有当前连接器的preHandle返回true的时候,它才会执行
  22. * 它可以做一些清理的操作
  23. */
  24. @Override
  25. **public void **afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) **throws **Exception {
  26. System.out.println(**"MyInterceptor1.afterCompletion执行了"**);
  27. }<br />}<br />在SpringMVC的配置文件配置拦截器(告诉SpringMVC我这里有个拦截器,不配置的话无法使用)<br /> <br />SpringMVC.xml<br /><!-- 配置拦截器,所有配置信息都写在里面 -->

<mvc:interceptors>

  1. <**mvc:interceptor**><br /> <!-- 配置拦截器拦截的映射:它只能拦截控制器方法的映射,不能拦截jsp,html,js,css,image等等<br /> path取值范围是@RequestMapping设置的值 比如:
  2. http://localhost:1111/MavenSSMExercise/account/hello<br /> 下面设置的是/account/** 那么url带account的映射都会被拦截
  3. -->
  4. <**mvc:mapping path="/account/**"**/><br /> <!-- 配置拦截器的bean对象 class指向的是自己编写的拦截器类 -->
  5. <**bean class="com.interceptors.MyInterceptor1" id="myInterceptor1"**></**bean**><br /> </**mvc:interceptor**><br /> <!--如果还有就在下面接着配就行-->
  6. <**mvc:interceptor**><br /> <**mvc:mapping path="/springmvc/**" **/><br /> <**bean class="com.interceptors.MyInterceptor2" id="myInterceptor2"**></**bean**><br /> </**mvc:interceptor**><br /></**mvc:interceptors**><br />结果:<br />![](https://cdn.nlark.com/yuque/0/2020/jpeg/350923/1592465270763-f9dbf713-216d-41ce-8ca1-9f303093c0d2.jpeg#align=left&display=inline&height=102&margin=%5Bobject%20Object%5D&originHeight=110&originWidth=346&status=done&style=none&width=322)

(十一)设置放行路径

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path=”/appUser//>
<
bean class=”com.lanmili.Interceptor.TokenInterceptor” id=”tokenInterceptor”**>

  1. <**property name="exceptUrls"**><br /> <**list**><br /> <**value**>/appUser/examineUserNickNameExist</**value**><br /> </**list**><br /> </**property**>
  2. </**bean**><br /> </**mvc:interceptor**>

</mvc:interceptors>



/**

  • 校验token的拦截器

*/

public class TokenInterceptor implements HandlerInterceptor {
// 这里有getset方法省略了
private List exceptUrls;/放行url集合/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

  1. **if **(**exceptUrls**.contains(request.getRequestURI())) { //直接放行
  2. **return true**;
  3. }<br /> <br /> **return true**;<br />

}



(十二)自定义异常使用&概念

拦截器使用&概念 - 图1

自定义异常使用
先自定义异常类
/**

*自定义异常类

*/

public class User2Exception extends Exception {

  1. **private **String **message**;
  2. **public **User2Exception(String message) {
  3. **this**.**message **= message;
  4. }
  5. @Override
  6. **public **String getMessage() {
  7. **return message**;
  8. }
  9. **public void **setMessage(String message) {
  10. **this**.**message **= message;
  11. }<br />}<br />controller层方法<br />/**
  • 测试异常信息

*/

@RequestMapping(“/testException”)

public String testException(User user) throws Exception {

  1. **if **(user.getUsername() == **null **|| **""**.equals(user.getUsername())) {
  2. //这样不友好,直接把错误显示到页面上了.
  3. // throw new RuntimeException("没有用户名不行");\
  4. **throw new **User2Exception(**"没有用户名不行"**);//自定义的异常处理器
  5. }
  6. **int **a = 1/0; //这是模拟系统异常
  7. **return "ok"**;

}
自定义异常解析器类

/**

  • 自定义异常解析器
  • 注意需要实现 HandlerExceptionResolver否则不行

  • 最后还需要在SpringMVC的xml配置文件里面配置这个信息

*/

public class User2ExceptionResolver implements HandlerExceptionResolver {

  1. /**
  2. * 重写父类方法
  3. */
  4. @Override
  5. **public **ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
  6. ex.printStackTrace();<br /> ModelAndView mv = **new **ModelAndView();
  7. //如果异常是自己定义的那个异常类.
  8. **if **(ex **instanceof **User2Exception) {
  9. //设置异常信息
  10. mv.addObject(**"errorMsg"**, ex.getMessage());
  11. } **else **{
  12. //这不是自己定义的异常信息,
  13. mv.addObject(**"errorMsg"**, **"服务器繁忙,请联系管理员"**);
  14. }<br /> mv.setViewName(**"error"**); //这是错误页面
  15. **return **mv; //这是返回的视图对象;
  16. }

}
最后需要在SpringMVC的xml里面告诉它 我这里有自定义异常
写在SpringMVC.xml里面





异常概念
系统中异常主要包括两类:
1. 预期异常
a) 通过捕获异常从而获取异常信息

2. 运行时异常RuntimeException,
a) 主要通过规范代码开发,测试通过手段减少运行时异常的发生

系统的dao,service,controller 出现都通过throw Exception 向上抛出,最后由SpringMVC DispatcherServlet (前端控制器)交由异常处理器进行异常处理
拦截器使用&概念 - 图2