Java 拦截器

🌺个人主页:杨永杰825_Spring,Mysql,多线程-CSDN博客

每日一句:成为架构师路途遥远

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️

目录

前言

常见拦截器

实现原理

示例

扩展

登录拦截器


 

前言

Java拦截器是一种在程序运行过程中拦截并处理请求的机制。它可以在方法执行之前、之后或异常时执行一些额外的操作,比如日志记录、性能监控、安全检查等。

常见拦截器

在Java中,拦截器通常是通过AOP(面向切面编程)实现的。常用的Java拦截器有:

  1. Servlet过滤器:用于拦截HTTP请求和响应。可以对请求进行预处理或对响应进行后处理,可以用于实现身份验证、日志记录等功能。

  2. Spring拦截器:用于拦截Spring MVC请求。可以在请求被处理前进行一些操作,比如身份验证、请求参数校验等。

  3. Hibernate拦截器:用于拦截Hibernate操作。可以在对象被保存、更新、删除或加载时进行一些操作,比如记录日志、数据验证等。

  4. JDBC拦截器:用于拦截JDBC操作。可以在执行SQL语句前后进行一些操作,比如性能监控、结果集处理等。

  5. AspectJ拦截器:用于拦截Java方法调用。可以在方法执行之前、之后或异常时进行一些操作,比如日志记录、事务管理等。

以上是几种常见的Java拦截器,它们可以在不同层次和场景下使用,提供了方便灵活的扩展能力,可以帮助开发者实现一些通用的功能和处理逻辑。

实现原理

  • Java 拦截器实现原理是基于动态代理的机制。拦截器是一种对方法进行包装的技术,可以在方法调用前后添加一些额外的逻辑。在Java中,拦截器通常通过代理模式实现。
  • Java中的代理模式有两种:静态代理和动态代理。静态代理需要预先定义一个代理类来实现对目标对象的包装,而动态代理则是在运行时动态生成代理类。
  • 动态代理的实现原理是通过 Java 提供的反射机制,根据接口定义动态地生成一个实现该接口的代理类,然后在代理类中调用拦截器的方法。代理类可以实现目标接口,并且在方法调用前后执行拦截器中的逻辑。
  • Java中通过两个主要的代理类来实现动态代理:JDK Proxy和CGLIB。JDK Proxy基于接口进行代理,只能代理实现了接口的类;而CGLIB可以代理类而无需实现接口。
  • 使用Java拦截器时,首先需要定义一个拦截器接口,其中包含了在方法调用前后需要执行的逻辑。然后,通过动态代理生成一个代理类对象,并将目标对象和拦截器对象传入代理类的构造函数。代理类在方法调用前后,会调用拦截器中的方法进行逻辑处理。

示例

拦截器的实现原理可以用以下伪代码表示:

interface Interceptor {
  void beforeInvoke();
  void afterInvoke();
}

class Proxy implements InvocationHandler {
  private Object target;
  private Interceptor interceptor;

  public Proxy(Object target, Interceptor interceptor) {
    this.target = target;
    this.interceptor = interceptor;
  }

  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    try {
      interceptor.beforeInvoke();
      Object result = method.invoke(target, args);
      interceptor.afterInvoke();
      return result;
    } catch (Exception e) {
      interceptor.handleException(e);
      throw e;
    }
  }
}

class Main {
  public static void main(String[] args) {
    // 创建目标对象
    MyService target = new MyServiceImpl();
    
    // 创建拦截器
    Interceptor interceptor = new MyInterceptor();
    
    // 创建代理对象
    MyService proxy = (MyService) Proxy.newProxyInstance(
      target.getClass().getClassLoader(),
      target.getClass().getInterfaces(),
      new Proxy(target, interceptor)
    );
    
    // 调用代理对象的方法
    proxy.doSomething();
  }
}

以上就是Java拦截器的实现原理,通过动态代理实现对目标对象方法的包装,从而实现了拦截器的功能。拦截器可以用来实现一些通用的逻辑,如日志记录、权限验证等。

扩展

登录拦截器

以下是一个简单的Java登录拦截器的示例代码:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginInterceptor implements Filter {
    
    private static final String LOGIN_URL = "/login"; // 登录页面的URL

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作(可选)
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 检查是否已登录
        if (isLoggedIn(request)) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            // 未登录,重定向到登录页面
            response.sendRedirect(request.getContextPath() + LOGIN_URL);
        }
    }

    @Override
    public void destroy() {
        // 销毁操作(可选)
    }

    private boolean isLoggedIn(HttpServletRequest request) {
        // 在这里根据具体的业务逻辑判断用户是否已登录
        // 可以使用Session或Token等方式进行登录状态的验证
        // 示例中使用Session判断用户是否已登录,示例代码如下:
        return request.getSession().getAttribute("user") != null;
    }
}

使用此拦截器需要在web.xml文件中配置:

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>your.package.name.LoginInterceptor</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

上述示例中的拦截器会在每个请求到达时检查用户是否已登录,如果未登录,则重定向至登录页面。需要根据具体的业务逻辑实现isLoggedIn方法,用于判断用户是否已登录。拦截器的功能可以根据具体需求进行扩展和定制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java杨永杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值