SpringMVC 07 -异常解析器&拦截器&跨域请求


SpringMVC 07 -异常解析器&拦截器&跨域请求

1 异常解析器

1.1 异常解析器,统一处理

Controller中的抛出需要集中处理的异常。

定义一个“异常解析器” 集中捕获处理 所有异常

此种方案,在集中管理异常方面,更有优势!

定义统一异常处理类

  • @param httpServletRequest request对象
  • @param httpServletResponse response对象
  • @param o 出现异常的Controller对象
  • @param e 异常
@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    /**
     *
     * @param httpServletRequest     request对象
     * @param httpServletResponse    response对象
     * @param o                      出现异常的Controller对象
     * @param e                      异常
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                         HttpServletResponse httpServletResponse,
                                         Object o,
                                         Exception e) {


        //1、可以通过异常的类型,来做出不同处理

//        if(e instanceof LongException){
//            modelAndView.setViewName("error");
//        }else if(e instanceof OrderException){
//            modelAndView.setViewName("error");
//        }else if(e instanceof PayException){
//            modelAndView.setViewName("error");
//        }

        //2、前端分离项目。通过响应流进行进行响应
        //httpServletResponse.getWriter().write(json)

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error");

        //打印异常信息
        e.printStackTrace();
        return modelAndView;
    }
}

注意:如果在Controller中对异常进行了处理,则不会进入异常处理解析器中

2 拦截器

2.1 作用

作用:抽取handler中的冗余功能,类似于过滤器

2.2 定义拦截器

执行顺序: preHandle–postHandle–afterCompletion

public class LoginInterceptor implements HandlerInterceptor { //AOP
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入到Handler之前执行【进行拦截操作】");

        HttpSession session = request.getSession();
        Object loginUser = session.getAttribute("loginUser");
        if(loginUser == null){
            response.sendRedirect(request.getContextPath()+"/pages/login.jsp");
            return false;
        }
        return true; //是否放行    false表示不放行   true放行
    }

    @Override
    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("进入到Handler之后执行【进行后续操作】");
    }

    @Override
    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("当请求成功之后数据渲染完成执行【资源释放】");
    }
}

2.3 配置拦截路径

SpringMVC拦截器配置

  • 可以设置多个拦截器,顺序有关系,从前往后依次过滤
  • 设置拦截的路径 (可以设置多个) /* 只能拦截/下的路径,不能拦截子路径 /**表示所有请求
<!--  SpringMVC拦截器配置(可以设置多个拦截器,顺序有关系,从前往后依次过滤)-->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 设置拦截的路径 (可以设置多个) /* 只能拦截/下的路径,不能拦截子路径  /**表示所有请求 -->
        <mvc:mapping path="/**"/>
        <!--  排除拦截的路径  (可以设置多个) -->
        <mvc:exclude-mapping path="/user/login"/>
        <bean class="com.ying.controller.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

3 跨域请求


3.1 域

域:协议+IP+端口

  • http://localhost:8989

  • http://localhost:8080

  • http://www.baidu.com:80

3.2 Ajax跨域问题

  • Ajax发送请求时,不允许跨域,以防用户信息泄露。

  • 当Ajax跨域请求时,响应会被浏览器拦截(同源策略),并报错。即浏览器默认不允许ajax跨域得到响应内容。

  • 互相信任的域之间如果需要ajax访问,(比如前后端分离项目中,前端项目和后端项目之间),则需要额外的设置才可正常请求。

3.3 解决方案

3.3.1 CORS配置

  • 允许其他域访问
  • 在被访问方的Controller类或者方法上,添加注解
    • origins:表示指定的来源(如果不写表示任何来源)
    • maxAge :表示缓存的有效时间 (以秒为单位)
@CrossOrigin("http://127.0.0.1:8848") //允许此域发请求访问
public class TestController {
	....
}

3.3.1 设置允许携带Cookie

  • 携带对方cookie,使得session可用
  • 在访问方,ajax中添加属性:withCredentials: true
$.ajax({
     type: "POST",
     url: "http://localhost:8989/web/sys/login",
     ...,
     xhrFields: {
       // 跨域携带cookie
       withCredentials: true
     }
});

注意:在Chrome浏览器上不允许跨域携带cookie,后续可以使用Nginx解决跨域问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinying293

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值