这里在上一篇文章做的基础上添加一个拦截住未登录用户的功能
步骤: 1.编写验证登陆的controller,service,dao三层 2.编写拦截器类,继承HandlerInterceptor接口并重写prehandler方法 3.在spring-mvc.xml文件中将编写的自定义拦截器配置进去
1.修改前端的跳转url
 编写controller 这里除了接收表单传入的username和password字段,还另外添加了httpsession对象,这个对象springmvc可以自动创建好添入 这个session对象用于存入登录的user信息@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.jsp";
}
return "redirect:/login.jsp";
}
快速添加service方法和dao方法,这里不展现接口了
serviceimpl
public User login(String username, String password) {
User user=userDao.finduserbyNP(username,password);
return user;
}
daoimpl
public User finduserbyNP(String username, String password) {
User user = jdbcTemplate.queryForObject("select * from sys_user where username=? and password=?", new BeanPropertyRowMapper<User>(User.class), username, password);
return user;
}
2.编写拦截功能的类
HandlerInterceptor接口有三个方法:
preHandle——在向模型注入数据之前的操作
postHandle——模型被注入数据之后,返回视图之前的操作
afterCompletion——返回视图之后的操作
这里按情况选择重写prehandle方法
思路即判断
public class loginIntercepter implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 判断用户是否登录即判断session中有没有user对象
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user==null){
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
return true;
}
}
3.配置xml文件
class即拦截功能类的相对位置 下面注释有解释标签功能特别注意——登录功能的controller的url要排除拦截操作,不然拦截登录把自己登录拦截了又不报错就死找不出问题了
<!-- 配置登录拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截哪些-->
<mvc:mapping path="/**"/>
<!-- 哪些不拦截-->
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/plugins/**"/>
<mvc:exclude-mapping path="/img/**"/>
<!--配置哪些资源排除拦截操作-->
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.wzy.intercepter.loginIntercepter"/>
</mvc:interceptor>
</mvc:interceptors>
==========================================================
异常处理
一同操作猛如虎之后呢,用户名和密码都正确的情况就没问题了
但当用户名或密码输错就会报EmptyResultDataAccessException错误
解决方法:在dao层将错误抛出,使用trycatch包裹
public User finduserbyNP(String username, String password) throws EmptyResultDataAccessException{
try {
User user = jdbcTemplate.queryForObject("select * from sys_user where username=? and password=?", new BeanPropertyRowMapper<User>(User.class), username, password);
return user;
}catch (EmptyResultDataAccessException e){
return null;
}
}
这样的话若查询不到结果则返回NULL,在controller层刚好有是否为null值的判断就刚好解决问题。
这里是刚好后面有处理方法,但若遇到其他异常该如何处理?
答案:抛——dao抛到service,service抛到controller,最后抛到springmvc前端控制器,前端处理器再交给异常处理器来处理异常
而在springmvc.xml文件中配置异常处理器中有简单映射异常处理器,即碰到异常之后跳转到别的页面去,这个处理器有两种处理方法
一是简单的默认异常处理页面,可以包揽所有异常,但都只跳转到同一个异常页面去【这里的error与之前的前后缀是相配合的,注意好创建文件的位置】
<!-- 配置异常处理-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"/>
</bean>
二是自定义细分异常(有默认就不能细分),这里可以为每个异常都设置一个页面做相应处理
<!-- 配置异常处理-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- <property name="defaultErrorView" value="error"/>-->
<property name="exceptionMappings">
<map>
<entry key="java.lang.NullPointerException" value="error1"/>
<entry key="java.lang.ClassCastException" value="error2"/>
</map>
</property>
</bean>
除了这个简单的映射之外,还可以自定义异常处理方法,让springmvc将异常交给自己写的方法来处理
步骤:
1.创建异常处理的类,继承HandlerExceptionResolver,重写其方法,为异常添加操作
2.将这个类配置到springmvc.xml中去,这个类也就是一个bean,将这个对象交给spring容器去管理即可
这个方法的参数有response域,request域,对象以及异常对象
下面只是对异常的类型进行简单的判断,判断后的操作是可以灵活变化的
public class ExceptionResolver implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if (e instanceof ClassCastException){
modelAndView.addObject("info","类转换异常");
modelAndView.setViewName("error");
}else if (e instanceof ClassCastException){
// 操作
}else {
// 操作
}
return modelAndView;
}
}
<bean class="com.wzy.resolver.ExceptionResolver"></bean>
操作完毕