1.拦截器(Interceptor)
拦截器是Spring框架提供的一种机制,用于在请求处理的过程中进行预处理和后处理操作。拦截器可以在请求到达Controller控制器之前和之后进行一些额外的处理,例如身份验证、日志记录、性能监控等。
1.1 使用拦截器
1.1.1 创建拦截器类
创建一个实现HandlerInterceptor接口的拦截器类,并实现相应的方法,包括preHandle、postHandle和afterCompletion方法
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前的预处理逻辑
// 可以进行认证、授权、日志记录等操作
// 如果需要拦截请求,可以直接返回或重定向到其他页面
// 返回true表示继续处理请求,返回false表示终止请求
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理之后、视图渲染之前的后处理逻辑
// 可以进行日志记录、异常处理等操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整个请求完成之后的后处理逻辑
// 可以进行清理资源等操作
}
}
1.1.2 注册拦截器及自定义配置
根据需要自定义拦截器的配置,例如指定拦截的特定URL模式、排除某些URL等
("/admin/**"):匹配以/admin/开头的所有URL路径及其子路径
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**") // 设置拦截的URL模式
.excludePathPatterns("/admin/login"); // 排除拦截的URL
}
}
1.2 过滤器和拦截器之间的区别
特点 | 过滤器 (Filter) | 拦截器 (Interceptor) |
---|---|---|
实现原理 | 基于函数回调(将一个函数作为参数传递给另一个函数,在适当的时机调用这个参数函数) | 基于Java的反射机制(动态代理) |
使用范围 | 依赖Servlet容器(tomcat等) | 独立于容器,可用于不同类型的程序 |
触发时机 | 在请求进入容器前和离开容器后 | 在请求进入Controller前和视图渲染后 |
拦截请求范围 | 所有进入容器的请求 | Controller中的请求和部分静态资源请求 |
注入Bean | 不能注入Spring管理的Bean | 可以注入Spring管理的Bean |
控制执行顺序 | 使用@Order注解控制执行顺序 | 注册顺序或使用@Order控制执行顺序 |
2.创建对象的四种方法
2.1 new
MyClass object = new MyClass();
2.2 反射
Class<?> clazz = Class.forName("com.example.MyClass");
MyClass object = (MyClass) clazz.newInstance();
2.3 反序列化
FileInputStream fileIn = new FileInputStream("object.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
MyClass object = (MyClass) in.readObject();
in.close();
2.4 克隆
Person clone = (Person)person.clone();
class Person implements Cloneable{
public String name;
public Pet pet;
//重写克隆方法
@Override
protected Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
p.pet=(Pet) this.pet.clone();
return p;
}
}