拦截器(Interceptor)是一种软件设计模式,用于在应用程序处理请求或响应时对其进行拦截和修改。拦截器可以在整个应用程序中使用,用于执行跨越多个层的通用任务,如身份验证、授权、缓存、日志记录、性能计量等。
在Web开发中,拦截器通常用于在请求到达控制器之前或响应返回客户端之前对其进行修改。例如,在Spring框架中,可以使用拦截器来实现身份验证和授权检查,记录请求和响应的日志,以及处理全局异常等。
拦截器的工作方式是通过将其注册到应用程序的处理管道中,并在请求或响应传递过程中执行相应的操作。拦截器可以访问请求上下文、响应上下文和处理程序对象,从而允许它们访问和修改请求或响应的属性和状态。拦截器还可以决定是否将请求和响应继续传递到下一个处理程序或终止请求。
总之,拦截器是一种非常有用的设计模式,可以帮助开发人员在应用程序中实现通用的功能,提高代码的可重用性和可维护性。
拦截器是一种非常有用的设计模式,它可以在应用程序处理请求或响应时对其进行拦截和修改。以下是拦截器的几个常见用途:
代码脚手架我传到网盘里面了,需要的同学请自取
我用夸克网盘分享了「tlias-web-management」,点击链接即可保存。
链接:https://pan.quark.cn/s/b98922faf182
package com.itheima.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override //目标资源方法运行前运行 返回true,放行 返回false 拦截
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
@Override //目标方法运行后运行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override //视图渲染完毕后运行,最后运行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
写入下面的代码
package com.itheima.config;
import com.itheima.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//加入拦截器(加入的拦截器就是我们刚刚创建的拦截器)
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
}
}
入门案例就完成了
通过配置拦截路径,我们可以设置拦截什么路径,放行什么路径
接口规范不同
:过滤器需要实现Filter接口,而拦截器需要实现HanglerInterceptor接口
拦截范围不同
:过滤器filter会拦截所有的资源,而Interceptor中会拦截Spring环境的资源
登录操作,我们需要使用LoginCheckFilter类,我们修改一下里面的代码
下面是修改后的代码
package com.itheima.interceptor;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override //目标资源方法运行前运行 返回true,放行 返回false 拦截
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
//获取请求的url
String url = req.getRequestURL().toString();
log.info("请求的url:{}",url);
//判断请求url中是否包含有login,如果包含,说明是登录操作,进行放行
if(url.contains("login")){
log.info("登录操作,放行");
return true;
}
//获取请求头的令牌(token)
String jwt=req.getHeader("token");
//判断令牌是否存在,如果不存在,返回错误结果(未登录)
//hasLength()方法判断字符串是否有长度(是否为空)
if (!StringUtils.hasLength(jwt)){
log.info("请求头token为空,返回未登录的信息");
Result error= Result.error("NOT_LOGIN");
//使用阿里巴巴的fastJSON工具包,将对象转成json字符串
String notLogin= JSONObject.toJSONString(error);
//响应给浏览器
resp.getWriter().write(notLogin);
return false;
}
//解析token,如果解析失败,返回登录结果
//jwt令牌
try {
JwtUtils.parseJWT(jwt);
}catch (Exception e){
e.printStackTrace();
log.info("解析token失败,返回未登录的错误信息");
Result error= Result.error("NOT_LOGIN");
//使用阿里巴巴的fastJSON工具包,将对象转成json字符串
String notLogin= JSONObject.toJSONString(error);
//响应给浏览器
resp.getWriter().write(notLogin);
return false;
}
//放行
log.info("令牌合法,放行");
return true;
}
@Override //目标方法运行后运行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override //视图渲染完毕后运行,最后运行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!