# **攔截器**
作用:攔截用戶登錄認證以及權限
> 1. AdminAuthInterceptor 后臺用戶權限驗證
> 2. AdminTokenInterceptor 后臺用戶登錄token驗證
> 3. FrontTokenInterceptor 移動端用戶登錄token驗證
> 4. SwaggerInterceptor Swagger登錄驗證
1. PC后臺訪問除過一下接口,其余必須驗證登錄操作
```
1、登錄
2、驗證碼
3、后臺登錄頁面輪播圖、LOGO
```
2. 移動端會有三種情況
```
1、必須登錄;用戶中心、下單等接口
2、不需要登錄;商品列表,首頁接口等;
3、如果登錄則取用戶信息,否則不取,根據用戶信息給出的數據不相同;優惠券接口
```
3. 如何配置以上三種情況,請仔細閱讀以下代碼
```
package com.zbkj.crmeb.config;
import com.filter.ResponseFilter;
import com.interceptor.AdminAuthInterceptor;
import com.interceptor.AdminTokenInterceptor;
import com.interceptor.FrontTokenInterceptor;
import com.interceptor.SwaggerInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.MappedInterceptor;
//token驗證攔截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 這里使用一個Bean為的是可以在攔截器中自由注入,也可以在攔截器中使用SpringUtil.getBean 獲取
// 但是覺得這樣更優雅
//后臺用戶權限
@Bean
public HandlerInterceptor adminAuthInterceptor(){
return new AdminAuthInterceptor();
}
//后臺用戶登錄
@Bean
public HandlerInterceptor adminTokenInterceptor(){
return new AdminTokenInterceptor();
}
//移動端用戶登錄
@Bean
public HandlerInterceptor frontTokenInterceptor(){
return new FrontTokenInterceptor();
}
@Bean
public ResponseFilter responseFilter(){ return new ResponseFilter(); }
@Value("${swagger.basic.username}")
private String username;
@Value("${swagger.basic.password}")
private String password;
@Value("${swagger.basic.check}")
private Boolean check;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加token攔截器
//addPathPatterns添加需要攔截的命名空間;
//excludePathPatterns添加排除攔截命名空間
//后臺token攔截
registry.addInterceptor(adminTokenInterceptor()).
addPathPatterns("/api/admin/**").
excludePathPatterns("/api/admin/validate/**");
//后臺權限規則
registry.addInterceptor(adminAuthInterceptor()).
addPathPatterns("/api/admin/**").
excludePathPatterns("/api/admin/validate/**");
//前端用戶登錄token
registry.addInterceptor(frontTokenInterceptor()).
addPathPatterns("/api/front/**").
excludePathPatterns("/api/front/qrcode/**");
}
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Bean
public FilterRegistrationBean filterRegister()
{
//注冊過濾器
FilterRegistrationBean registration = new FilterRegistrationBean(responseFilter());
registration.addUrlPatterns("/*");
return registration;
}
/* 必須在此處配置攔截器,要不然攔不到swagger的靜態資源 */
@Bean
@ConditionalOnProperty(name = "swagger.basic.enable", havingValue = "true")
public MappedInterceptor getMappedInterceptor() {
return new MappedInterceptor(new String[]{"/swagger-ui.html", "/webjars/**"}, new SwaggerInterceptor(username, password, check));
}
}
```
4. 針對2.3如何處理?
```
1、不做任何配置,讓FrontTokenInterceptor來攔截
2、在FrontTokenInterceptor做部分路由判斷;判斷路由,部分路由不管用戶是否登錄都可以訪問
3、看下面核心代碼;在CheckFrontToken.checkRouter里配置路由即可
```
```
package com.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.common.CheckFrontToken;
import com.common.CommonResult;
import com.utils.RequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//token驗證攔截器
public class FrontTokenInterceptor implements HandlerInterceptor {
@Autowired
private CheckFrontToken checkFrontToken;
//程序處理之前需要處理的業務
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setCharacterEncoding("UTF-8");
String token = checkFrontToken.getTokenFormRequest(request);
if(token == null || token.isEmpty()){
//判斷路由,部分路由不管用戶是否登錄都可以訪問
boolean result = checkFrontToken.checkRouter(RequestUtil.getUri(request));
if(result){
return true;
}
response.getWriter().write(JSONObject.toJSONString(CommonResult.unauthorized()));
return false;
}
Boolean result = checkFrontToken.check(token, request);
if(!result){
response.getWriter().write(JSONObject.toJSONString(CommonResult.unauthorized()));
return false;
}
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){}
}
```
```
package com.common;
import com.constants.Constants;
import com.utils.RedisUtil;
import com.utils.RequestUtil;
import com.utils.ThreadLocalUtil;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 檢測token是否過期
* Created on 2019/11/23
* @author zhangle
*/
@Component
public class CheckFrontToken {
@Autowired
protected RedisUtil redisUtil;
public Boolean check(String token, HttpServletRequest request){
try {
boolean exists = redisUtil.exists(Constants.USER_TOKEN_REDIS_KEY_PREFIX + token);
if(exists){
Object value = redisUtil.get(Constants.USER_TOKEN_REDIS_KEY_PREFIX + token);
Map<String, Object> hashedMap = new HashMap<>();
hashedMap.put("id", value);
ThreadLocalUtil.set(hashedMap);
redisUtil.set(Constants.USER_TOKEN_REDIS_KEY_PREFIX +token, value, Constants.TOKEN_EXPRESS_MINUTES, TimeUnit.MINUTES);
}else{
//判斷路由,部分路由不管用戶是否登錄/token過期都可以訪問
exists = checkRouter(RequestUtil.getUri(request));
}
return exists;
}catch (Exception e){
return false;
}
}
//路由在此處,則返回true,無論用戶是否登錄都可以訪問
public boolean checkRouter(String uri) {
String[] routerList = {
"api/front/product/detail",
"api/front/coupons",
"api/front/index"
};
return ArrayUtils.contains(routerList, uri);
}
public String getTokenFormRequest(HttpServletRequest request){
return request.getHeader(Constants.HEADER_AUTHORIZATION_KEY);
}
}
```
- 序言
- 快速上手
- 項目架構圖
- App功能圖
- Admin功能圖
- 快速了解
- 快速開始
- 本地開發
- 服務器及系統搭建
- 服務器購買
- 域名購買(已有域名則跳過)
- 域名解析
- 服務器配置
- 寶塔配置
- 創建站點
- 服務部署
- Docker預覽
- 新手入門
- 運行項目和打包前準備
- Java項目運行和打包
- VUE WEB PC 管理端運行和打包
- Uniapp 移動端運行和打包
- 第三方
- 客服_騰訊云智服
- 客服_螞蟻智能客服
- 復制第三方平臺商品99API
- 公眾號
- 公眾號配置
- 公眾號開發配置
- 公眾號設置菜單
- 公眾號設置關鍵字
- 公眾號設置跳轉網頁
- 公眾號設置跳轉小程序
- uniapp打包H5、公眾號
- 公眾號模板消息
- 微信小程序
- 微信平臺配置
- CRMEB后臺配置
- 微信小程序提交審核
- 微信小程序版本發布
- 微信小程序訂閱消息
- 微信小程序客服
- 添加微信交易組件
- 秒殺產品
- 支付
- 微信支付配置
- 微信公眾號支付
- 微信小程序支付
- 支付寶支付
- App
- 1、基礎配置
- 2、開發調試
- 4、打包上線
- 5、APP打包
- 6、App升級
- 使用說明
- 首頁
- 商品分類
- 分類說明
- 分類管理
- 普通產品
- 發布商品
- 商品規格
- 商品評價
- 前臺頁面
- 產品詳情
- 產品熱門搜索
- 營銷
- 優惠券
- 發布優惠券
- 領取及使用
- 積分
- 積分設置
- 積分來源
- 積分使用
- 秒殺配置維護
- 秒殺商品維護
- 砍價管理
- 砍價規則
- 砍價活動
- 拼團管理
- 拼團規則
- 拼團活動
- 視頻號管理
- 草稿列表
- 一號通
- 商品列表
- 微信視頻號直播
- 分銷
- 分銷配置
- 分銷規則說明
- 分銷員管理
- 提現
- 傭金提現
- 發起提現
- 后臺審核
- 本地存儲
- 會員等級
- 七牛云存儲
- 等級說明
- 騰訊云存儲
- 文章管理
- 阿里云存儲
- 文章界面
- 發布文章
- 訂單管理
- 后臺訂單處理
- 訂單退款
- 訂單打印
- 賬戶管理
- 賬號信息
- 賬戶資金
- 郵費說明
- 郵費組成
- 商城運費設置
- 運費模板
- 設置
- 系統配置
- 商品采集
- 物流查詢
- 電子面單
- 短信
- 管理權限
- 身份管理
- 管理員列表
- 權限管理
- 物流配置
- 文件上傳配置
- 提貨點
- 設置提貨點
- 核銷員
- 核銷訂單
- 頁面管理
- 一鍵換色
- 頁面設計
- 第三方接口設置
- 物流查詢
- 庫存說明
- 統計管理
- 首頁看板
- 商品統計
- 用戶統計
- 交易統計
- 常見問題
- 服務器配置相關
- 寶塔redis設置密碼
- 前端項目部署在一個nginx下通過目錄訪問
- java項目常見問題
- Swagger 后臺 API 文檔
- Java項目日志
- start.sh啟動報錯
- 退款問題
- win服務出現亂碼問題
- WEB PC 管理端常見問題
- WEB PC頁面刷新和富文本上傳圖片404
- npm鏡像問題
- 測試環境微信授權彈出提示框
- 文件上傳
- 后臺管理系統登錄問題
- 后臺核銷人員通過移動端核銷訂單
- npm install github出錯暴力解決(僅限此項目)
- 運費模板查詢出錯
- 取消掉粒子效果
- 素材提供
- 移動端相關問題
- 微信開發工具上傳代碼超包
- 支付成功但訂單顯示失敗
- 移動端刷新404
- 小程序生成推二維碼失敗
- 圖片問題
- 圖片素材導入
- 一鍵換色
- 源碼問題
- 代碼怎么下載和更新
- 1.3.7更新
- 支付相關
- 商戶平臺添加支付授權目錄
- 業務常見問題
- 版權
- 移動端基本介紹
- 首頁
- 分類頁
- 個人中心
- WEB PC 管理端基本介紹
- 后臺前端目錄結構
- 前端開發配置
- 前端配置說明
- 前端添加頁面
- 前端引用組件
- 前端構建和發布
- 技術文檔
- 配置
- 目錄結構
- 項目
- Crmeb
- 移動端
- PC后臺
- 開發規范
- 數據字典
- 任務
- 組合數據
- 后臺表單說明
- 攔截器
- 過濾器
- MyBatis-Plus
- 無限級分類設計
- 分頁配置
- 必看內容
- 七牛云
- 本地存儲
- 七牛云存儲
- 騰訊云存儲
- 阿里云存儲
- 附錄
- 視頻教程
- Java 后臺程序
- WEB PC 管理端
- Uniapp 移動端
- 二開錦囊
- 集成第三方SDK
- 阿里
- 短信