使用Java拦截器实现请求和响应的拦截

Java拦截器简单使用
拦截器(Interceptor)是在程序处理请求和发送响应之前,可以截获、处理请求以及处理响应的一种机制。在Java中,拦截器通常用于对请求和响应进行预处理或后处理,以便在实际处理业务逻辑之前或之后执行特定的操作。

  1. 为什么使用拦截器?
    拦截器是实现面向切面编程(AOP)的一种方式,可以用于:

日志记录:记录请求信息、响应时间等。
权限验证:在请求到达业务逻辑之前,验证用户是否有权限执行该操作。
异常处理:在处理业务逻辑时,捕获并处理异常,以提高系统的稳定性。
缓存:在拦截器中检查缓存,如果缓存中存在所需数据,则直接返回,而不需要访问数据库。

  1. Java中的拦截器
    在Java中,拦截器主要应用于框架和技术,例如Spring MVC、Servlet、Struts等。本文将以Spring MVC框架为例介绍如何简单使用拦截器。

  2. 创建一个拦截器类
    首先,我们需要创建一个实现了HandlerInterceptor接口的拦截器类。这个接口包含了三个方法:

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {

    @Autowired
    private SUserInfoService sUserInfoService;

    /**
     * controller 请求前运行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1、获取请求路径
        String url = request.getRequestURL().toString();
        log.info("请求的url:{}", url);

        // 2、判断当前请求路径是否包含登录 如果包含登录放行
        if (url.contains("login")) {
            log.info("登录操作 放行...");
            return true;
        }
        // 3、获取登录的令牌(token)
        String token = request.getHeader("token");
        // 4、判断令牌是否存在
        if (!StringUtils.hasLength(token)) {
            log.info("请求头openId为空,返回未登录提示");
            R error = R.error(ResultCode.UNAUTHORIZED, "未登录");
            String notLogin = JSONObject.toJSONString(error);
            response.getWriter().write(notLogin);
            return false;
        }
        // 5、解析令牌,如果解析失败、返回错误结果(未登录)
        try {
            SUserInfo userInfo = sUserInfoService.getOne(new QueryWrapper<SUserInfo>().eq("token", token));
            if (ObjectUtils.isEmpty(userInfo)) {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败,返回未登录信息");
            R error = R.error(ResultCode.UNAUTHORIZED, "未登录");
            String notLogin = JSONObject.toJSONString(error);
            response.getWriter().write(notLogin);
            return false;
        }
        // 6、放行
        log.info("令牌合法,放行");
        return true;
    }

    /**
     * 后处理回调方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    /**
     * 操作成功后处理的方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
}

4、创建一个WebConfig配置类
创建一个实现了WebMvcConfigurer 接口的拦截器类。这个接口包含了addInterceptors方法

// 配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * addInterceptor 添加拦截器 loginCheckInterceptor
         * addPathPatterns 添加拦截路径 /** 拦截所有
         * excludePathPatterns 排除拦截路径
         */
        registry.addInterceptor(loginCheckInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

至此就实现了一个简单的拦截器

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,拦截器(Interceptor)是一种常见的设计模式,用于在方法调用之前或之后添加额外的逻辑处理。在Web开发中,拦截器常用于处理请求、验证用户身份、记录日志等操作。下面是一个简单的示例,演示如何实现一个拦截器。 首先,创建一个拦截器类,实现Spring框架的`HandlerInterceptor`接口。该接口定义了三个方法,分别对应请求处理前、请求处理后和请求完成后的操作。 ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor 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 { // 在请求完成后执行的逻辑 } } ``` 接下来,配置拦截器类,让它生效。可以通过Spring配置文件或注解的方式进行配置。 通过Spring配置文件配置拦截器: ```xml <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有请求 --> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 通过注解配置拦截器: ```java 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 MyInterceptor()).addPathPatterns("/**"); // 拦截所有请求 } } ``` 以上示例中的`com.example.MyInterceptor`是自定义的拦截器类,你可以根据实际需求来编写自己的拦截器逻辑。在`preHandle`方法中可以进行请求的预处理,如验证用户身份、权限校验等;在`postHandle`方法中可以对响应进行处理;在`afterCompletion`方法中可以进行一些清理工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值