SpringMVC拦截器和异常处理机制
1 SpringMVC拦截器
在向前端控制器发送消息进行请求时之间设置拦截器,判断是否放行的功能。
1.1 SpringMVC拦截器的实现
① 创建拦截器类实现HandlerInterceptor接口
public class Interceptor_01 implements HandlerInterceptor {
// 目标方法执行前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("pre");
return true;
}
//目标方法执行之后,视图对象返回之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("post");
}
//整个过程执行完毕后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("after");
}
}
② Spring-mvc.xml中配置拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 要拦截的资源-->
<mvc:mapping path="/**"/>
<bean class="lifeilin.interceptor.Interceptor_01"/>
</mvc:interceptor>
</mvc:interceptors>
核心控制器测试方法:
@Controller
public class TargetController {
@RequestMapping("/target")
public ModelAndView show(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","北京");
modelAndView.setViewName("index");
return modelAndView;
}
}
1.2 用户登录权限控制
需求:用户没有登录的情况下,不能对后台菜单进行访问操作,点击菜单跳转到登录页面,只有用户登录情况下才能进行后台功能的操作。
2.1.1 登录不成功
① 创建拦截器类实现HandlerInterceptor接口
public class PrivilegeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 判断用户是否登录,即判断session中是否有数据
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user == null) {
//没有数据
response.sendRedirect(request.getContextPath() + "/login.jsp");
return false;
}
return true;
}
}
② Spring-mvc.xml中配置拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置对那些资源拦截-->
<mvc:mapping path="/**"/>
<!-- 配置对哪些资源放行-->
<mvc:exclude-mapping path="/user/login"/>
<bean class="lifeilin.interceptor.PrivilegeInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
2.2.2 登录成功:登录页面登录比对数据库返回到操作界面
@RequestMapping("/login")
public String login(String username, String password, HttpSession session) {
User user = userService.login(username, password);
if (user != null) {
//查到数据
session.setAttribute("user", user);
return "redirect:../index";//注意这里需要返回一层,因为配置了前缀为pages,而这个资源与pages同级
} else {
return "redirect:../login";
}
}
@Override
public User login(String username, String password) {
try {
User user = userDao.login(username, password);
return user;
} catch (EmptyResultDataAccessException e) {
return null;
}
}
@Override
public User login(String username, String password) throws EmptyResultDataAccessException {
User query = jdbcTemplate.queryForObject("select * from sys_user where username = ? and password = ?", new BeanPropertyRowMapper<User>(User.class), username, password);
return query;
}
2 Spring异常处理机制
2.1 简单异常处理器SimpleMappingExceptionResolver
SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置
2.2 自定义异常处理
① 创建异常处理器类实现HandlerExceptionResolver
② 配置异常处理器