springmvc拦截器&异常处理

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

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

1.修改前端的跳转url

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210203161756110.png?x-oss-process=image/watermark,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>

操作完毕

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值