SpringMVC拦截器
一: 在springmvc配置文件
<mvc:interceptors>
!--定义全局拦截器-->
<bean class="cn.yunhe.controller.Intertype"/>
<!--定义排除在外的拦截器方法-->
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<mvc:exclude-mapping path="/user/get"/> //排除在外的
<bean class="cn.yunhe.controller.SessionContrller"/>
</mvc:interceptor>
</mvc:interceptors>
1.创建枚举定义全局错误带代码
public enum Errcode {
Gl_SYS_BUSY("001","系统繁忙"),
Gl_SYS_NULL("101","空指针"),
Gl_SYS_FORMAT_ERR("102","数字格式化异常"),
Gl_SYS_ARG_INVALID("103","请求参数校验不通过"),
USER_AUTH_ERR("103","用户密码不正确"),
NO_SESSION("104","会话不存在");
public String code;
public String msg;
private Errcode(String code,String msg){
this.code=code;
this.msg=msg;
}
}
2.自定义一个异常
public class ServiceExcption extends RuntimeException{
private static final long serialVersionUID = 1L;
private Errcode err;
public ServiceExcption (Errcode err){
this.err=err;
}
public Errcode getErr() {
return err;
}
public void setErr(Errcode err) {
this.err = err;
}
3.在定义一个全局异常处理类,用于异常后的拦截
@RestControllerAdvice
public class GlobaGlobalExceptionHandler {
//log4j
private Logger logger = LogManager.getLogger
(GlobaGlobalExceptionHandler.class);
//总异常
@ExceptionHandler(Exception.class)
public ResultModel<?> hanleException(Exception ex){
logger.info("异常繁忙");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_BUSY.code);
rm.setMsg(Errcode.Gl_SYS_BUSY.msg);
logger.error(ex.getMessage());
return rm;
}
@ExceptionHandler(NullPointerException.class)
public ResultModel<?> hanleException1() {
logger.info("空指针异常");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_NULL.code);
rm.setMsg(Errcode.Gl_SYS_NULL.msg);
return rm;
}
@ExceptionHandler(NumberFormatException.class)
public ResultModel<?> hanleException2() {
logger.info("数字格式化异常");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_FORMAT_ERR.code);
rm.setMsg(Errcode.Gl_SYS_FORMAT_ERR.msg);
return rm;
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public ResultModel<?> hanleException3() {
logger.info("请求参数校验不通过");
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(Errcode.Gl_SYS_ARG_INVALID.code);
rm.setMsg(Errcode.Gl_SYS_ARG_INVALID.msg);
return rm;
}
@ExceptionHandler(ServiceExcption.class)
public ResultModel<?> hanleException4(ServiceExcption se) {
ResultModel<Void> rm = new ResultModel<Void>();
rm.setCode(se.getErr().code);
rm.setMsg(se.getErr().msg);
return rm;
}
4.创建拦截器
public class SessionContrller implements HandlerInterceptor{
private Logger logger = LogManager.getLogger(SessionContrller.class);
public boolean preHandle(HttpServletRequest request, HttpServletResponse
httpServletResponse, Object o) throws Exception {
logger.debug("开始执行回话!!!!");
//判断是否进行了登陆
if (request.getSession() == null || request.getSession().getAttribute
("userid") == null) {
logger.debug("验证有异常啦");
//response.sendRedirect(location);
throw new ServiceExcption(Errcode.NO_SESSION);
}
return true;
}
public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)
throws Exception {
logger.debug("第二次来时回话");
}
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
logger.debug("第三次回话");
}
}
二.其他方法中可以进行判断进行抛出异常
例如:
/**
* 删除指定订单
* @param orderid
* @return
*/
@RequestMapping(value = "/{orderid}",method = RequestMethod.DELETE)
public ResultModel<?> delOrder(@PathVariable String orderid) {
logger.debug("orderid"+orderid);
//通过跑出自定义异常,来进行操作
if (orderid.equals("200")){
throw new ServiceExcption(Errcode.Gl_SYS_ARG_INVALID);
}
System.out.println("这里是订单删除,订单id是"+orderid);
ResultModel<Void> rm = new ResultModel<Void>();
// TODO:去调用服务层代码,到数据库删除订单
return rm;
}