Java拦截器

java拦截器是基于动态代理(反射机制)实现的。
拦截器是AOP(Aspect Oriented Programming,即面向方面编程的技术)的一个实现

业务接口和业务实现类

public interface IOAService {
    public void onclineOffice();
}
public class OAService implements IOAService {
    @Override
    public void onclineOffice() {
        System.out.println("onclineOffice工作中。。。");
    }
}

Brightmart的动态代理类,它有两个普通方法:before和after.

//Brightmart自定义的拦截器类,它有两个普通方法:before和after
public class BrightmartInterceptor {
    public void before() {
        System.out.println("Brightmart的拦截器类,的before()方法");
    }

    public void after() {
        System.out.println("Brightmart的拦截器类,的after()方法");
    }
}

Brightmart的动态代理类,用于代理某个类。本示例中我们用来代理【OA办公系统】服务类,目标是将特定的任务绑定到【OA办公系统】服务类之前或之后来执行。我们可以认为在绑定了绑定被代理类和代理处理器(bind()),并显示调用被代理类的方法时候,invoke便被执行

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class BrightmartDynamicProxy implements InvocationHandler {
    // 被代理的对象
    private Object object;
    // Brightmart自定义的拦截器(它是一个普通的类)
    private BrightmartInterceptor interceptor = new BrightmartInterceptor();

    // 动态生成一个代理类对象,并绑定被代理类(object)和代理处理器(this).
    // 或者说:bind方法返回一个特定的,具有代理功能的对象,这个对象根据传入的被代理对象的接口而定。
    public Object bind(Object object) {
        this.object = object;
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
    }

    // method:被调用的方;args:方法的参数;标记为1,2的方法可以根据你业务需要而改动,或只在调用前或调用后执行某种操作
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        interceptor.before();// 1 调用before方法
        method.invoke(object, args);
        interceptor.after();// 2 调用after方法
        return result;
    }
}

执行自定义拦截器类

public class TestBrightmartInterceptor {
    public static void main(String[] args) {
        // Brightmart自己实现的拦截器,调用bind方法获取一个代理类,这个代理类调用原有的业务逻辑类(被代理类)的方法。
        BrightmartDynamicProxy handler = new BrightmartDynamicProxy();
        IOAService oaService = new OAService();
        IOAService oaServiceProxy = (IOAService) handler.bind(oaService);// 关键代码
        oaServiceProxy.onclineOffice();
    }
}

运行结果如下:

Brightmart的拦截器类,的before()方法
我们使用OA在线办公系统onclineOffice,工作中(onlineOffice)。。。
Brightmart的拦截器类,的after()方法

拦截器类 需要两个配合使用这里只有一个 @Configuration public class ServletContextConfig extends WebMvcConfigurerAdapter { public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/"); super.addResourceHandlers(registry); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerMyInterceptorAdapter()).addPathPatterns("/**") .excludePathPatterns("/") // .excludePathPatterns("/expressions/getExpressionsList") .excludePathPatterns("/loginInfo/getCordByIsPhone") .excludePathPatterns("/loginInfo/login11") //token失效跳轉 .excludePathPatterns("/loginInfo/insertLoginInfo") //注册 .excludePathPatterns("/loginInfo/login") //登录 .excludePathPatterns("/upload") //上传文件 .excludePathPatterns("/uploadListen") //上传文件 .excludePathPatterns("/admin/user/goLogin") //后台跳转登录 .excludePathPatterns("/admin/user/login") //后台登录 .excludePathPatterns("/loginInfo/getLoginInfo") //忘记密码 .excludePathPatterns("/loginInfo/getCord") //短信验证码 .excludePathPatterns("/loginInfo/getIsLoginInfo") //判断验证码&&登录 .excludePathPatterns("/loginInfo/getIsLoginInfo1") //判断验证码 .excludePathPatterns("/loginInfo/setPassWord") //设置密码 ; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } @Component public class HandlerMyInterceptorAdapter implements HandlerInterceptor { @Autowired private HeartbeatServiceImpl heartbeatService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { String url = request.getRequestURI(); if (url.contains("admin")) { User user = (User) request.getSession().getAttribute("user"); try { if (user.equals(null)) { response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } else { return true; } }catch (Exception e){ response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } }else { String token = request.getHeader("token"); if (token != null) { Jedis jedis = new Jedis(com.sevenSteps.util.RedisConfig.HOST, RedisConfig.PORT); String s = jedis.get(token); if(token.equals(s)) { heartbeatService = SpringUtil.getBean(HeartbeatServiceImpl.class); return heartbeatService.setOutDate(token); }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值