springmvc过滤器拦截器区别(SpringMVC之异常解析器拦截器)
springmvc过滤器拦截器区别(SpringMVC之异常解析器拦截器).....}catch(Exception1 e){public String xxx(){try{......
一、异常解析器项目中会面临各种异常
- 运行时异常,大多在开发测试阶段解决掉
- 非运行时异常,是必须要处理的
- 业务异常,是根据业务要求,在出现非法情况时,人为抛出的
DAO、service的所有异常,必须无条件上抛,全部集中到Controller
Controller中处理所有异常,将不同的异常转发到不同的错误处理结果中
2、方案方案一、Controller中的每个handler自己处理异常
public String xxx(){
try{
......
}catch(Exception1 e){
.....
}catch(Exception1 e){
.....
}
}
这种处理异常的方式,把异常处理的逻辑分散在各个handler中,不利于管理。
方案二:Controller中的每个handler不在自己处理异常,而是直接上抛所有异常。
定义一个“异常解析器”集中捕获处理所有异常
public class MyExResolver implements HandlerExceptionResolver {
/**
*
* @param httpServletRequest
* @param httpServletResponse
* @param o 出现异常的handler
* @param e
* @return
*
* 异常解析器:主体逻辑
* 执行时刻:当handler中抛出异常时,会执行,捕获异常,并可以跳转到错误页面
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest HttpServletResponse httpServletResponse Object o Exception e) {
ModelAndView mv = new ModelAndView();
if (e instanceof SQLException){
mv.setViewName("redirect:/dispatch/xxx");
}else if (e instanceof NullPointerException){
mv.setViewName("redirect:/dispatch/xxx");
}else{
mv.setViewName("redirect:/dispatch/xxx");
}
return mv;
}
}
<!--在springmvc中声明异常解析器即可-->
<bean class="com.suyang.resolver.MyExResolver"></bean>
二、拦截器
主要针对 handler 抽取controller中的冗余功能。
主要作用场景:登录判断(用的较少)
1、定义拦截器public class MyInterceptor implements HandlerInterceptor{
//在handler之前执行
public boolean preHandle(HttpServletRequest request HttpServletResponse response Object handler) throws Exception {
//登录状态判断
if (request.getSession().getAttribute("user") != null) {
return true;
}
response.sendRedirect("/user/login"); //中断前响应
return false;//拦截了,中断请求,后续的拦截器或handler都不在执行
}
//在handler之后执行
public void postHandle(HttpServletRequest request HttpServletResponse response Object handler @Nullable ModelAndView modelAndView) throws Exception {
}
//页面渲染完毕执行
public void afterCompletion(HttpServletRequest request HttpServletResponse response Object handler @Nullable Exception ex) throws Exception {
}
}
2、配置拦截路径
<!--声明拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/inter/**"/>
<bean class="com.suyang.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
三、上传1、导入依赖
<!--======================上传下载======================-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--======================上传下载======================-->
2、表单
//上传文件时,enctype="multipart/form-data"
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload/test1" method="post" enctype="multipart/form-data">
<input type="text" name="username"/><br>
<input type="file" name="source" /><br>
<input type="submit" value="上传">
</form>
</body>
</html>
3、上传解析器
<!--上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--请求的编码格式,必须和jsp的pageEncoding属性一致,默认为ISO-8859-1-->
<property name="defaultEncoding" value="utf-8"/>
<!--最大上传文件大下,单位字节-->
<property name="maxUploadSize" value="1048576"/>
</bean>
4、Handler
配置上传解析器后,handler中形参MultipartFile source才会收到请求的文件
@RequestMapping("test1")
public String test1(MultipartFile source String username) throws IOException {
//文件的原始名称
String filename = source.getOriginalFilename();
//定制全局唯一的命名
String unique = java.util.UUID.randomUUID().toString();
//获取文件的后缀
String ext = FilenameUtils.getExtension(filename);
//定制全局唯一文件名
String uniqueFileName = unique "." ext;
System.out.println("全局唯一文件名=" uniqueFileName);
//文件类型
String type = source.getContentType();
System.out.println("filename:" filename "---type:" type);
//将上传的文件存到指定目录中
source.transferTo(new File("f:\\" filename));
return "index";
}
四、下载1、超链
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>下载</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/download/test1?name=20211111143240.jpg">免费下载</a>
</body>
</html>
2、Handler
@RequestMapping("test1")
public void test1(String name HttpServletResponse response) throws IOException {
//下载文件存放路径
String path = "f:";
//文件的完整路径 File.separator="\"
String filepath = path File.separator name;
System.out.println(filepath);
//设置响应头,告知浏览器,要以附件的形式保存内容,name为浏览器显示的下载文件名
//不设置会默认打开文件
response.setHeader("content-disposition" "attachment;filename=" name);
//new FileInputStream()读取目标文件,response.getOutputStream()写出给客户端浏览器
IOUtils.copy(new FileInputStream(filepath) response.getOutputStream());
}