|
@@ -0,0 +1,84 @@
|
|
|
+package com.pj.api.filter;
|
|
|
+
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.pj.utils.cache.RedisUtil;
|
|
|
+import com.pj.utils.sg.AjaxJson;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+
|
|
|
+import javax.servlet.*;
|
|
|
+import javax.servlet.annotation.WebFilter;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.PrintWriter;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@WebFilter(filterName = "apiFilter", urlPatterns = "/api/*")
|
|
|
+public class ApiFilter implements Filter {
|
|
|
+
|
|
|
+ private static final List<String> urls = new ArrayList<String>() {{
|
|
|
+ add("/api/login");
|
|
|
+ }};
|
|
|
+
|
|
|
+ @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;
|
|
|
+ response.setContentType("application/json;charset=utf-8");
|
|
|
+ response.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ String uri = request.getRequestURI();
|
|
|
+ Map<String, String[]> m = new HashMap<>(request.getParameterMap());
|
|
|
+ RequestWrapper wrapper = new RequestWrapper(request, m);
|
|
|
+ if (urls.contains(uri)) {
|
|
|
+ filterChain.doFilter(wrapper, response);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String token = request.getHeader("token");
|
|
|
+
|
|
|
+ if (StrUtil.isEmpty(token)) {
|
|
|
+ errorToken(response);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Long userId = ApiJwtHelper.getUserId(token);
|
|
|
+ String type = ApiJwtHelper.getUserType(token);
|
|
|
+ String name = ApiJwtHelper.getName(token);
|
|
|
+ if (userId == null || StrUtil.isEmpty(type) || StrUtil.isEmpty(name)) {
|
|
|
+ errorToken(response);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String cacheToken = RedisUtil.get("app:token:" + userId);
|
|
|
+ if (!ApiJwtHelper.verify(cacheToken, userId, name, type)) {
|
|
|
+ errorToken(response);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ wrapper.addParameter("loginId", userId);
|
|
|
+ wrapper.addParameter("loginName", name);
|
|
|
+ wrapper.addParameter("loginType", type);
|
|
|
+ filterChain.doFilter(wrapper, response);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void errorToken(HttpServletResponse response) throws IOException {
|
|
|
+ PrintWriter writer = response.getWriter();
|
|
|
+ AjaxJson json = AjaxJson.getError("无效令牌",401);
|
|
|
+ String errorToken = JSONObject.toJSONString(json);
|
|
|
+ writer.print(errorToken);
|
|
|
+ writer.close();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void destroy() {
|
|
|
+
|
|
|
+ }
|
|
|
+}
|