拦截器:
拦截不符合规则的,放行符合规则的。 等价于过滤器。
拦截器只拦截controller层API接口。
如何定义拦截器。
定义一个类并实现拦截器接口
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取session对象
HttpSession session=request.getSession();
//获取session当前用户的信息
Object userinfo = session.getAttribute("userinfo");
if(userinfo==null){
//没有登录,跳转到登录页面
response.sendRedirect("/login.jsp");
return false;
}
return true; //如果返回值为true,表示拦截器放行。否则,拦截器不放行
}
}
注册拦截器并配置拦截规则--springmvc配置文件中
<!--注册自定义拦截器以及拦截规则-->
<mvc:interceptors>
<mvc:interceptor>
<!--path:拦截的路径 /**表示拦截多层路径-->
<mvc:mapping path="/**"/>
<!--排除的路径。-->
<mvc:exclude-mapping path="/user/login"/>
<!--放置自定义的拦截器类-->
<bean class="com.aaa.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
全局异常处理
如果controller发生异常,我们需要对controller层中的所有方法都进行处理。这样比较麻烦。我们可以对所有controller中的接口提供一个统一的异常处理。
定义全局异常类
//全局异常处理类.
@ControllerAdvice
public class MyGlobalException {
@ExceptionHandler(Exception.class) //当发生Exception类型的异常会执行该方法,并异常对象传递给该方法的参数。
@ResponseBody
public String handlerException(Exception e){
System.out.println(e.getMessage());
System.out.println("错误~~~~~~~~~~~~~~~~~~~~~~~~~");
return "error2222222222222222222222";//经过视图解析器: /views/error.jsp
}
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public String handlerArithmeticException(Exception e){
System.out.println("错误****************************");
return "error2222222222222222222";
}
}
注意:保证springmvc能够扫描到该异常处理类
function loadEmp(){
$.ajax({
url:"/emp/list",
type:"get",
dataType:"json",
//服务器响应成功
success:function(data){
console.log(data)
var str="";
for(var i=0;i<data.length;i++){
str+="<tr>"
str+="<td>"+data[i].empId+"</td>"
str+="<td>"+data[i].empName+"</td>"
str+="<td>"+data[i].empJob+"</td>"
str+="<td>"+data[i].empSalary+"</td>"
str+="<td>"+data[i].dept.deptName+"</td>"
str+="<td><a οnclick='deleteEmp("+data[i].empId+")'>删除</a><a οnclick='/views/update.jsp'>修改</a></td>"
str+="</tr>"
}
document.getElementById("empBody").innerHTML=str;
},
//服务器响应故障
error: function (data){
console.log(data);
}
})
}
文件上传
原理
完成文件上传--本地服务器保存
引入文件上传的依赖jar
<!--文件上传依赖-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
配置文件上传解析器
<!--文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--最大上传的大小。单位byte字节。5M=5*1024*1024-->
<property name="maxUploadSize" value="5242880"/>
<!--设置文件上传的编码-->
<property name="defaultEncoding" value="utf-8"/>
</bean>
编写文件上传的页面
<%--文件上传的表单提交方式必须为post.而且需要设置表单提交的编码格式。enctype="multipart/form-data" 该类型表示既能上传文本又能上传文件。--%>
<form action="/upload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="myfile"/><br>
姓名:<input type="text" name="username"/><br>
<input type="submit"/>
</form>
编写上传的api接口
@RequestMapping("/upload")
public String upload(MultipartFile myfile, HttpServletRequest request) throws IOException {
//1.获取保存文件的路径
String realPath = request.getSession().getServletContext().getRealPath("/images");
//2.根据上面的路径创建文件对象
File file=new File(realPath);
//3.判断该文件夹是否存在
if(!file.exists()){
file.mkdirs();
}
//4.获取上传文件的名称. 获取登录者ip+登录者id+登录者的时间戳
String filename = UUID.randomUUID().toString().replace("-","")+myfile.getOriginalFilename();
//5.把上传的文件保存到指定服务器下的路径。
File target=new File(realPath+"/"+filename);
myfile.transferTo(target);
System.out.println("上传成功");
return "main";
}
完成文件上传--文件保存到文件服务器
如果把文件存在本地服务器,服务器与服务器之间无法共享文件。我们需要一个专门存放文件的服务器。
可以自己搭建文件服务器[FastDFS Hadoop] 或者租第三方阿里云。