使用
拦截器使用
先编写一个拦截器类 必须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 {
/**
* 此方法是拦截器的拦截方法,它在控制器方法执行之前执行。
* 此方法return true的时候表示放行。return false 表示不放行
*/
@Override
**public boolean **preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) **throws **Exception {
System.out.println(**"MyInterceptor1.preHandle 执行了"**);
//return false; //不放行
**return true**; //表示放行
}
/**
* 放行之后,控制器方法执行完成之后,此方法执行。
* 它可以对响应的内容进行处理
* 此方法执行时,视图还没有执行。
*/
@Override
**public void **postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) **throws **Exception {
System.out.println(**"MyInterceptor1.postHandle执行了"**);
}<br /> /**
* 它是在视图执行完成之后执行。
* 只有当前连接器的preHandle返回true的时候,它才会执行
* 它可以做一些清理的操作
*/
@Override
**public void **afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) **throws **Exception {
System.out.println(**"MyInterceptor1.afterCompletion执行了"**);
}<br />}<br />在SpringMVC的配置文件配置拦截器(告诉SpringMVC我这里有个拦截器,不配置的话无法使用)<br /> <br />SpringMVC.xml<br /><!-- 配置拦截器,所有配置信息都写在里面 -->
<mvc:interceptors>
<**mvc:interceptor**><br /> <!-- 配置拦截器拦截的映射:它只能拦截控制器方法的映射,不能拦截jsp,html,js,css,image等等<br /> path取值范围是@RequestMapping设置的值 比如:
http://localhost:1111/MavenSSMExercise/account/hello<br /> 下面设置的是/account/** 那么url带account的映射都会被拦截
-->
<**mvc:mapping path="/account/**"**/><br /> <!-- 配置拦截器的bean对象 class指向的是自己编写的拦截器类 -->
<**bean class="com.interceptors.MyInterceptor1" id="myInterceptor1"**></**bean**><br /> </**mvc:interceptor**><br /> <!--如果还有就在下面接着配就行-->
<**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”**>
<**property name="exceptUrls"**><br /> <**list**><br /> <**value**>/appUser/examineUserNickNameExist</**value**><br /> </**list**><br /> </**property**>
</**bean**><br /> </**mvc:interceptor**>
</mvc:interceptors>
/**
- 校验token的拦截器
*/
public class TokenInterceptor implements HandlerInterceptor {
// 这里有getset方法省略了
private List
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
**if **(**exceptUrls**.contains(request.getRequestURI())) { //直接放行
**return true**;
}<br /> <br /> **return true**;<br />
(十二)自定义异常使用&概念
自定义异常使用
先自定义异常类
/**
*自定义异常类
*/
public class User2Exception extends Exception {
**private **String **message**;
**public **User2Exception(String message) {
**this**.**message **= message;
}
@Override
**public **String getMessage() {
**return message**;
}
**public void **setMessage(String message) {
**this**.**message **= message;
}<br />}<br />controller层方法<br />/**
- 测试异常信息
*/
@RequestMapping(“/testException”)
public String testException(User user) throws Exception {
**if **(user.getUsername() == **null **|| **""**.equals(user.getUsername())) {
//这样不友好,直接把错误显示到页面上了.
// throw new RuntimeException("没有用户名不行");\
**throw new **User2Exception(**"没有用户名不行"**);//自定义的异常处理器
}
**int **a = 1/0; //这是模拟系统异常
**return "ok"**;
}
自定义异常解析器类
/**
- 自定义异常解析器
注意需要实现 HandlerExceptionResolver否则不行
最后还需要在SpringMVC的xml配置文件里面配置这个信息
*/
public class User2ExceptionResolver implements HandlerExceptionResolver {
/**
* 重写父类方法
*/
@Override
**public **ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ex.printStackTrace();<br /> ModelAndView mv = **new **ModelAndView();
//如果异常是自己定义的那个异常类.
**if **(ex **instanceof **User2Exception) {
//设置异常信息
mv.addObject(**"errorMsg"**, ex.getMessage());
} **else **{
//这不是自己定义的异常信息,
mv.addObject(**"errorMsg"**, **"服务器繁忙,请联系管理员"**);
}<br /> mv.setViewName(**"error"**); //这是错误页面
**return **mv; //这是返回的视图对象;
}
}
最后需要在SpringMVC的xml里面告诉它 我这里有自定义异常
写在SpringMVC.xml里面
异常概念
系统中异常主要包括两类:
1. 预期异常
a) 通过捕获异常从而获取异常信息
2. 运行时异常RuntimeException,
a) 主要通过规范代码开发,测试通过手段减少运行时异常的发生
系统的dao,service,controller 出现都通过throw Exception 向上抛出,最后由SpringMVC DispatcherServlet (前端控制器)交由异常处理器进行异常处理