赞
踩
是一种动态拦截方法调用的机制,类似于过滤器。
拦截器是Spring框架中提供的,用来动态拦截控制器方法的执行。
在拦截器当中,我们通常也是做一些通用性的操作,比如:我们可以通过拦截器来拦截前端发起的请求,将登录校验的逻辑全部编写在拦截器当中。在校验的过程当中,如发现用户登录了(携带JWT令牌且是合法令牌),就可以直接放行,去访问spring当中的资源。如果校验时发现并没有登录或是非法令牌,就可以直接给前端响应未登录的错误信息。
实现HandlerInterceptor接口,并重写其所有方法
- //自定义拦截器
- @Component
- public class LoginCheckInterceptor implements HandlerInterceptor {
- //目标资源方法执行前执行。 返回true:放行 返回false:不放行
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("preHandle .... ");
-
- return true; //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 .... ");
- }
- }
- @Configuration
- public class WebConfig implements WebMvcConfigurer {
-
- //自定义的拦截器对象
- @Autowired
- private LoginCheckInterceptor loginCheckInterceptor;
-
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- //注册自定义拦截器对象
- registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
- }
- }
- //自定义拦截器
- @Component //当前拦截器对象由Spring创建和管理
- @Slf4j
- public class LoginCheckInterceptor implements HandlerInterceptor {
- //前置方式
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("preHandle .... ");
- //1.获取请求url
- //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
-
- //3.获取请求头中的令牌(token)
- String token = request.getHeader("token");
- log.info("从请求头中获取的令牌:{}",token);
-
- //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
- if(!StringUtils.hasLength(token)){
- log.info("Token不存在");
-
- //创建响应结果对象
- Result responseResult = Result.error("NOT_LOGIN");
- //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
- String json = JSONObject.toJSONString(responseResult);
- //设置响应头(告知浏览器:响应的数据类型为json、响应的数据编码表为utf-8)
- response.setContentType("application/json;charset=utf-8");
- //响应
- response.getWriter().write(json);
-
- return false;//不放行
- }
-
- //5.解析token,如果解析失败,返回错误结果(未登录)
- try {
- JwtUtils.parseJWT(token);
- }catch (Exception e){
- log.info("令牌解析失败!");
-
- //创建响应结果对象
- Result responseResult = Result.error("NOT_LOGIN");
- //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
- String json = JSONObject.toJSONString(responseResult);
- //设置响应头
- response.setContentType("application/json;charset=utf-8");
- //响应
- response.getWriter().write(json);
-
- return false;
- }
-
- //6.放行
- return true;
- }
- @Configuration
- public class WebConfig implements WebMvcConfigurer {
- //拦截器对象
- @Autowired
- private LoginCheckInterceptor loginCheckInterceptor;
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- //注册自定义拦截器对象
- registry.addInterceptor(loginCheckInterceptor)
- .addPathPatterns("/**")
- .excludePathPatterns("/login");
- }
- }
让login通过的话最好将路径写全。例如/admin/employee/login
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。