1.Spring MVC拦截器原理
拦截器实现类,计算耗时与认证操作
public class Authinterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//判断用户有没有登录,如果没有登录显示login.html
//如果登录成功,继续执行controller,postHandle
//从request中取得session
HttpSession session=request.getSession();
//从session中取用户名
String username=(String) session.getAttribute("username");
if (StringUtils.isEmpty(username)) {
//为空,用户没有登录,通知浏览器显示login.html
response.sendRedirect("/login.html");
return false;//不执行controller,postHandle
}
return true;
}
}
//拦截器
public class TimeInterceptor implements HandlerInterceptor{
long startTime;
//在controller方法之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
startTime=System.nanoTime();//纳秒
return HandlerInterceptor.super.preHandle(request, response, handler);
}
//在controller方法之后执行postHandle
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long endTime=System.nanoTime();
long useTime=endTime-startTime;
//得到用户请求的url
String url=request.getRequestURI();
System.out.println(url+"time:"+useTime);
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
}
//配置参数
@Component//组件,作用像RestController,加上后会自动创建对象
public class WebConfig implements WebMvcConfigurer{
//告诉框架,我们有哪些拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
Authinterceptor authinterceptor=new Authinterceptor();
registry.addInterceptor(authinterceptor).addPathPatterns("/order","/cart");
TimeInterceptor timeInterceptor=new TimeInterceptor();
registry.addInterceptor(timeInterceptor).addPathPatterns("/**");
//PathPatterns访问所有urltimeInterceptor
WebMvcConfigurer.super.addInterceptors(registry);
}
}
用户控制层
@RestController
public class UserController {
//接收用户名,放在session中
@RequestMapping("/login")
public String login(String username,HttpSession session) {
session.setAttribute("username", username);
return "登录成功";
}
}
拦截器配置类
//配置参数
@Component//组件,作用像RestController,加上后会自动创建对象
public class WebConfig implements WebMvcConfigurer{
//告诉框架,我们有哪些拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
Authinterceptor authinterceptor=new Authinterceptor();
registry.addInterceptor(authinterceptor).addPathPatterns("/order","/cart");
TimeInterceptor timeInterceptor=new TimeInterceptor();
registry.addInterceptor(timeInterceptor).addPathPatterns("/**");
//PathPatterns访问所有urltimeInterceptor
WebMvcConfigurer.super.addInterceptors(registry);
}
}
2.手写简单的动态代理
接口
public interface IDAO {
public String select(String username);
}
实现类
public class UserDAO implements IDAO {
@Override
public String select(String username) {
return "目标类UserDAO.select()"+username;
}
}
使用动态代理对象执行目标方法
public class TestProxy {
public static void main(String[] args) {
UserDAO target=new UserDAO();
//根据target得到类对象,
Object proxyObject=getProxy(target);
//得到代理对象的类对象
Class clazz = proxyObject.getClass();
//通过类对象得到类型
System.out.println(clazz.getName());//这个类是java动态生成的
//通过类对象得到类的方法
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
//select(){调用invocationHandle.invoke()}
System.out.println(method.getName());
}
//类型转换
IDAO userIdao=(IDAO)proxyObject;
Object result = userIdao.select("admin");
System.out.println(result);
}
private static Object getProxy(IDAO target) {
//得到目标类的所有接口
Class[] interfaces = target.getClass().getInterfaces();
//得到类加载器
ClassLoader classLoader = target.getClass().getClassLoader();
//创建invocationHandler对象
MyHandler myHandler=new MyHandler(target);
//调用java生成代理
Object proxyObject=Proxy.newProxyInstance(classLoader, interfaces, myHandler);
return proxyObject;
}
//1.创建InvocationHandler的实现类
static class MyHandler implements InvocationHandler{
IDAO target;
//通过构造方法接收目标类对象
public MyHandler(IDAO target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke");
//执行扩展功能
long startTime=System.nanoTime();
//调用目标类
Object result=method.invoke(target, args);
return result;
}
}
}