ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springmvc拦截器&异常处理

2021-02-03 19:57:47  阅读:101  来源: 互联网

标签:username 拦截器 return String springmvc user password 异常


这里在上一篇文章做的基础上添加一个拦截住未登录用户的功能

步骤: 1.编写验证登陆的controller,service,dao三层 2.编写拦截器类,继承HandlerInterceptor接口并重写prehandler方法 3.在spring-mvc.xml文件中将编写的自定义拦截器配置进去

1.修改前端的跳转url

![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210203161756110.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYyNTg3NA==,size_16,color_FFFFFF,t_70) 编写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>

操作完毕

标签:username,拦截器,return,String,springmvc,user,password,异常
来源: https://blog.csdn.net/weixin_45625874/article/details/113610930

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有