陈士柏 il y a 2 ans
Parent
commit
b319f9b728
1 fichiers modifiés avec 131 ajouts et 0 suppressions
  1. 131 0
      mhotel/src/com/happy/filter/TokenFilter.java

+ 131 - 0
mhotel/src/com/happy/filter/TokenFilter.java

@@ -0,0 +1,131 @@
+package com.happy.filter;
+
+import com.alibaba.fastjson.JSONObject;
+import com.happy.Model.Filter.Manage_map;
+import com.happy.common.JwtUtil;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class TokenFilter implements Filter {
+
+    Enumeration param;
+
+    public TokenFilter() {
+    }
+
+    public void init(FilterConfig filterConfig) throws ServletException {
+        this.param = filterConfig.getInitParameterNames();
+    }
+
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
+        HttpServletRequest request = (HttpServletRequest)servletRequest;
+        HttpServletResponse response = (HttpServletResponse)servletResponse;
+        response.setCharacterEncoding("utf-8");
+        response.setHeader("Content-type","text/html;charset=UTF-8");//向浏览器发送一个响应头,设置浏览器的解码方式为UTF-8
+        // apipost中参数名Cookie,值_COOKIE_NAME=11111111
+        String token = getRequestToken(request);
+        String path = request.getRequestURI();
+        //管理端需要拦截的路径
+        if (Manage_map.isInterpreter(path)){
+            if (token != null) {
+                //验证token是否正确
+                boolean result = JwtUtil.verify(token);
+                if (result) {
+                    chain.doFilter(request,response);
+                } else {
+                    JSONObject resultJson = new JSONObject();
+                    resultJson.put("code", 402);
+                    resultJson.put("message", "token错误");
+                    OutputStream stream = servletResponse.getOutputStream();
+                    stream.write(resultJson.toString().getBytes());
+                }
+            } else { //如果没有登录,则跳转到登录界面
+                JSONObject resultJson = new JSONObject();
+                resultJson.put("code", 401);
+                resultJson.put("message", "token为空");
+                OutputStream stream = servletResponse.getOutputStream();
+                stream.write(resultJson.toString().getBytes());
+                //chain.doFilter(request,response);
+                /**
+                 * 以下是为了登录成功后返回到刚刚的操作,不跳到主界面
+                 * 实现:通过将请求URL保存到session的beforePath中,然后在登录时判断beforePath是否为空
+                 */
+            }
+        } else {
+            chain.doFilter(request,response);
+        }
+    }
+
+    public void destroy() {
+    }
+
+    /**
+     * 根据名字获取cookie
+     *
+     * @param request
+     * @param name    cookie名字
+     * @return
+     */
+    public static Cookie getCookieByName(HttpServletRequest request, String name) {
+        Map<String, Cookie> cookieMap = ReadCookieMap(request);
+        if (cookieMap.containsKey(name)) {
+            Cookie cookie =  cookieMap.get(name);
+            return cookie;
+        } else {
+            return null;
+        }
+    }
+    /**
+     * 将cookie封装到Map里面
+     *
+     * @param request
+     * @return
+     */
+    private static Map<String, Cookie> ReadCookieMap(HttpServletRequest request) {
+        Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
+        Cookie[] cookies = request.getCookies();
+        if (null != cookies) {
+            for (Cookie cookie : cookies) {
+                cookieMap.put(cookie.getName(), cookie);
+            }
+        }
+        return cookieMap;
+    }
+
+    public static String getRequestToken(HttpServletRequest httpRequest){
+        //从header中获取token
+        String token = httpRequest.getHeader("token");
+        //如果header中不存在token,则从参数中获取token
+        if(StringUtils.isBlank(token)){
+            token = httpRequest.getParameter("token");
+        }
+        return token;
+    }
+
+    /**
+     * 返回信息给客户端
+     *
+     * @param response
+     * @param out
+     * @param apiResponse
+     */
+    private void responseMessage(HttpServletRequest request, HttpServletResponse response, PrintWriter out, String apiResponse) throws IOException {
+        response.setContentType("application/json; charset=utf-8");
+        out.print(JSONObject.toJSONString(apiResponse));
+        out.flush();
+        out.close();
+    }
+
+}