SpringMVC异步调用异常拦截器
Spring异步数据处理
- 如果返回json格式的字符串使用@ResponseBody
- 如果对于异步传递的数据封装成为一个实体类在参数中使用@RequestBody
跨域访问
-
跨域的定义:
- 协议不同
- IP地址不同
- 端口不同
- 以上其中一个不同就视为跨域
-
解决方案
-
使用@CrossOrigin注解
-
类型:方法注解,类注解
-
作用:设置当前处理器方法/处理器类中所有的方法支持跨域访问
-
示例
@RequestMapping("/ajaxReturnJson") @ResponseBody @CrossOrigin public User ajaxReturnJson(){ User user = new User(); user.setName("Jockme"); user.setAge(40); return user; }
-
拦截器
-
Spring的处理流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SyAOdQzK-1595504940255)(F:\MarkDownOnte\学习笔记\Spring\assets\1595298761975.png)]
-
拦截器与过滤器异同点
-
过滤器是始于servlet的一种技术,拦截器属于springMVC的技术
-
如果使用了过滤器是在dispatherServlet对响应之前进行拦截过滤,处理完毕以后在经过过滤器返回
-
拦截器是对经过dispatherServlet分发以后的响应进行拦截。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQAtHvLt-1595504940258)(F:\MarkDownOnte\学习笔记\Spring\assets\1595299110640.png)]
-
-
自定义拦截器
-
package com.wx.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 自定义的拦截器 * 实现HandlerInterceptor接口 */ public class MyInterceptor implements HandlerInterceptor { /** *自定义拦截器 * @param request * @param response * @param handler * @return 如果返回的结果false就拦截请求 * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("拦截器前置处理"); // return true; response.getWriter().write("RequestAreBlocked"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("后置处理"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("完成以后通知"); } }
在配置文件中加载拦截器
<!--加载自定义拦截器--> <mvc:interceptors> <mvc:interceptor> <!--拦截路径--> <mvc:mapping path="/*"/> <!--自定义拦截器坐标--> <bean class="com.wx.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
-
拦截器参数
ModelAndView modelAndView 对于请求正常处理完毕以后对于响应数据进行后置处理
-
拦截器的执行顺序
- 配置顺序就是执行顺序
- 当拦截器运行中断仅运行配置在前面的拦截器的afterCompletion操作
-
SpringMVC的异常处理
-
设置类实现HandlerExceptionResolver
@Component public class MyExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mav = new ModelAndView(); System.out.println("正在处理异常"); // 设置异常的信息 mav.addObject("msg","异常信息"); // 设置跳转的页面 mav.setViewName("error.jsp"); return mav; } }
-
实现类的方式是在dispatherservlet无法拦截到参数类型转换异常
-
使用注解方式可以拦截到参数类型转换异常
@Component @ControllerAdvice // 标记当前类是异常处理类 public class MyAnnotationExceptionResolver { @ExceptionHandler(Exception.class) // 设置要处理的异常 @ResponseBody // 以响应体的方式处理数据 public Exception doException(Exception ex){ // 打印堆栈跟踪信息到控制台 ex.printStackTrace(); return ex; } }
- 在方法的前面要加上@ResponseBody,不然浏览器会认为是在跳转页面
-
项目异常处理方案
- 异常分类:
- 业务异常
- 发送对应消息给用户,提醒规范操作
- 系统异常
- 发送固定消息给用户,安抚用户
- 其他异常
- 记录异常发消息给相关人员处理异常
- 业务异常
- 异常分类:
文件上传下载
-
导入相关的组件
<!--文件上传下载组件--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
-
在配置类中导入相关的bean
<!--配置文件上传bean--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
-
在文件上传表单中的name属性与方法参数保持一致
<form action="/fileupload" method="post" enctype="multipart/form-data"> 上传:<input type="file" name="aaa一致"/> <br/> <input type="submit" value="提交"/> </form>
-
处理上传文件类
/** * 文件上传下载 */ @RequestMapping("/fileupload") public String fileupload(MultipartFile aaa一致) throws IOException { // 设置文件存储的地点 MultipartFile参数名必须与表单中name属性一直 file.transferTo(new File("a.png")); // 跳转页面 return "file.jsp"; }
Restful
- Restful (Representational state transfer)表象层状态转变 简介:
- 一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
- 优点:
- 隐藏资源的访问行为,通过地址无法知道是何种操作
- 书写简化
Restful行为方式
GET http://localhost/user/1 GET 通过get方式访问数据表示获取数据
POST http://localhost/user POST 通过POST方式访问数据表示保存数据
PUT http://localhost/user PUT 通过put方式更新数据
DELETE http://localhost/user DELETE 通过delete访问方式删除数据
Restful行为方式
GET http://localhost/user/1 GET 通过get方式访问数据表示获取数据
POST http://localhost/user POST 通过POST方式访问数据表示保存数据
PUT http://localhost/user PUT 通过put方式更新数据
DELETE http://localhost/user DELETE 通过delete访问方式删除数据