文章目录
1 SpringMVC拦截器
1.1 拦截器的概念
SpringMVC的拦截器(Interceptor)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,将拦截器按一定的顺序联结成一条链,这条链称为拦截器链,在访问被拦截的方法或字段时,拦截器链中的拦截器会按照被配置的顺序依次被调用,拦截器也是AOP思想的具体实现
1.2 拦截器和过滤器的区别
2 拦截器的快速入门
自定义拦截器的步骤:
1,创建拦截器类实现HandlerInterceptor接口
2,在spring-mvc.xml中配置拦截器
1,创建拦截器类实现HandlerInterceptor接口:
public class MyInterceptor implements HandlerInterceptor {
// 在目标方法被执行之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
// 判断请求中有无param参数 如果有且值为"yes"则放行
// 如果没有则请求重定向到error.jsp页面
String param = request.getParameter("param");
if(param.equals("yes")) {
return true;
} else {
request.getRequestDispatcher("/error.jsp").forward(request, response);
return false;
}
}
// 在目标方法执行后 视图对象返回之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
// 在返回视图前 更换视图 且向视图中增加新的数据
modelAndView.setViewName("ok");
modelAndView.addObject("name", "when");
}
// 目标方法全部执行完毕后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
// 整个方法结束后,重定向到index.jsp页面
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
2,在spring-mvc.xml中配置拦截器:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- path标明对哪些方法拦截 /**是拦截所有方法 -->
<mvc:mapping path="/**"/>
<bean class="com.coisini.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
3,测试:
当preHandle的返回值为false时,整个方法无法继续执行:
当preHandle的返回值为true时,整个方法可以连贯执行:
当在spring-mvc.xml中配置多个拦截器时,就构成了拦截器链:
3 用户登录权限控制
3.1 登录拦截器
1,自定义登录拦截器:
public class PrivilegeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 这里只有一个逻辑 判断用户是否登录 本质是看session中有无User
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
// session中没有user则代表用户没有登录 需要重定向到登录页面
if(user == null) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
return false;
}
// 已登录则放行
return true;
}
}
2,在spring-mvc中配置拦截器:
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 权限拦截器 拦截除了登录操作外所有方法 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!-- 排除对某些资源的拦截 这里需要放行登录方法 否则登录永远失败 -->
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.coisini.interceptor.PrivilegeInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
3,测试,随机点击一个功能:
3.2 登录功能的完成
当跳转到登录页面时,用户输入用户名和密码后,交给Dao层查询,如果数据库中有对应的用户,则将User放到Session中并跳转到首页,如果不正确或不存在,回到登录界面
1,更改登录表单提交的地址:
2,创建表单提交映射的方法:
@RequestMapping("/login")
public String login(String username, String password, HttpSession session) {
User user = this.userService.login(username, password);
if(user != null) {
// 登录成功,将user存储在Session中
session.setAttribute("user", user);
return "redirect:/index.jsp";
}
return "redirect:/login.jsp";
}
3,测试用户zhangsan,密码123:
当正确输入时没有问题,但输入数据库不存在的用户信息时:
这个错误来源于底层查询时使用的jdbcTemplate.queryForObject(),该方法如果没有查到数据,会抛出一个EmptyResultDataAccessException异常,而不是null,为此需要对此进行处理,可以让Dao层的方法抛出该异常,在Service层进行try-catch捕获,如果出现异常向Controller层返回null即可避免
4 SpringMVC异常处理机制
对于web程序中出现的异常,以往都是在Service层中采用try-catch的方式直接处理,但是这样做也有许多问题:
1,异常处理的代码和Service层业务代码耦合在了一起
2,同一种异常可能会出现在多处,这样就不得不重复处理
为此,可以将异常处理的工作抽取出来,将Dao,Service,Controller出现的异常全部向上抛,最后由SpringMVC前端控制器交由异常处理器进行处理
4.1 异常处理的两种方式
1,使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
需要在spring-mvc.xml文件中配置
2,使用Spring的异常处理接口HandlerExceptionResolver
自定义自己的异常处理器
1,使用SimpleMappingExceptionResolver:
SpringMVC已经定义好了该处理器,使用时可以根据项目情况在spring-mvc.xml中进行相应异常与视图的映射配置
<!-- 配置简单异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 具体异常的配置 每种异常对应一个页面 -->
<property name="exceptionMappings">
<map>
<entry key="com.coisini.exception.MyException" value="myException"></entry>
<entry key="com.lang.ClassCastException" value="classCastError"></entry>
</map>
</property>
<!-- 默认异常对应error.jsp页面 -->
<property name="defaultErrorView" value="error"></property>
</bean>
2,自定义异常处理器:
自定义异常处理器的步骤:
1,创建异常处理器实现HandlerExceptionResolver
2,在spring-mvc.xml中配置异常处理器
1,创建异常处理器实现HandlerExceptionResolver:
2,在spring-mvc.xml中配置异常处理器:
<!-- 自定义异常处理器 -->
<bean class="com.coisini.resolver.MyExceptionResolver"></bean>