zoukankan      html  css  js  c++  java
  • 过滤器 单点登录

    package com.hailian.interceptors;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.util.Map;
    import java.util.regex.Pattern;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    import org.codehaus.jackson.JsonParseException;
    import org.codehaus.jackson.map.JsonMappingException;
    import org.codehaus.jackson.map.ObjectMapper;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.util.StringUtils;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    import com.hailian.annotation.AuthPower;
    import com.hailian.common.TokenConstants;
    import com.hailian.conf.Constant;
    import com.hailian.enums.PlatformType;
    import com.hailian.exception.AppWebException;
    import com.hailian.utils.JWTUtil;
    
    /**
     * Package: com.hailian.interceptor.AppInterceptors
     * Description: 描述
     * Copyright: Copyright (c) 2017
     *
     * @author lv bin
     * Date: 2018/1/19 14:11
     * Version: V1.0.0
     */
    @Configuration
    public class AppInterceptors extends WebMvcConfigurerAdapter{
    
        // 路径中版本的前缀, 这里用 /v[1-9]/的形式
        private final static Pattern VERSION_PREFIX_PATTERN = Pattern.compile("v(\d+)/");
    
        @Value("${app.version}")
        private String APP_VERSION;
    
        /**
         * 默认请求request header 头部存放 token 名称
         */
        public static String DEFAULT_TOKEN_NAME = "X-Token";
    
        /**
         * 参数加密值
         */
        public static String DEFAULT_AUTH_NAME = "X-Sign";
    
        public static String DEFAULT_PLATFORM = "X-Platform";
        public static String REQUEST_TIME = "http_request_time";
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            /*registry.addInterceptor(new HandlerInterceptorAdapter() {
                @Override
                public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                                         Object handler) throws Exception {
                    request.setAttribute(REQUEST_TIME, new Date());
                    return true;
                }
            }).addPathPatterns("/*","/user/**");*/
            registry.addInterceptor(new ApiInterceptor()).addPathPatterns("/api/**");
            registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/bigSreen/**");
        }
    
        /**
         * 单点登录
         * @author lzg
         */
        private class TokenInterceptor extends HandlerInterceptorAdapter{
             @Override
             public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                 response.setCharacterEncoding("utf-8");
                 request.setCharacterEncoding("utf-8");
                 String targetUrl = "http://t.c.haier.net/login?url=http://dvp.haier.net";
                 //检验session
                 HttpSession session = request.getSession();
                 String userCode = (String) session.getAttribute(Constant.PORTAL_USER_690);
                 
                 //若session为空检验token
                 if(StringUtils.isEmpty(userCode)) {
                     
                     String tokenStr = request.getParameter("token");
                     
                     if(StringUtils.isEmpty(tokenStr)) {response.sendRedirect(targetUrl);}
                     
                     HttpPost post = new HttpPost("http://dvp.haier.net/userServiceYonghong/checkUserToken?token="+tokenStr);
                         
                     CloseableHttpClient client = HttpClients.createDefault();
                     CloseableHttpResponse response1 = null;
                     String rest = "";
                        try {
                            response1 = client.execute(post);
                            
                            rest = EntityUtils.toString(response1.getEntity(), "utf-8");
                            
                            //返回结果形如  {"result":"success","userAlias":"王健","userId":"A0000662"}
                            System.out.println(rest);
                            
                            if(StringUtils.isEmpty(rest)) {response.sendRedirect(targetUrl);}
                            
                            //获取信息账户
                            ObjectMapper  objectMapper = new ObjectMapper(); 
                            Map<String,String> maps = objectMapper.readValue(rest, Map.class);
                            for (String string : maps.keySet()) { System.out.println(string+":"+maps.get(string));     }
                            String status =  maps.get("result");
                            String userAlias = maps.get("userAlias");
                            userCode = maps.get("userId");
                            if("error".equals(status)||StringUtils.isEmpty(status)||StringUtils.isEmpty(userAlias)||StringUtils.isEmpty(userCode)) {
                                response.reset();response.sendRedirect(targetUrl);
                            }
                            //设置session
                            request.getSession().setAttribute(Constant.PORTAL_USER_690,userCode);
                        } catch (JsonParseException e) { e.printStackTrace();
                        response.sendRedirect(targetUrl);
                        } catch (JsonMappingException e) { e.printStackTrace();
                        response.sendRedirect(targetUrl);
                        } catch (IOException e) { e.printStackTrace();
                        } catch (Exception e) { e.printStackTrace();
                        }
                 }
                return true;
             }
            
        }
        
        /**
         * api 拦截器
         */
        private class ApiInterceptor extends HandlerInterceptorAdapter{
    
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
                String uri = request.getRequestURI();
    
                boolean avoidVersion = false;
    
                boolean avoidLogin = true;
    
                boolean avoidPower = true;
    
                boolean avoidSign = true;
                boolean avoidPlatform = true;
                if(handler instanceof HandlerMethod) {
    
                    HandlerMethod method = (HandlerMethod) handler;
                    AuthPower authPower = method.getMethodAnnotation(AuthPower.class);
                    avoidVersion = authPower.avoidVersion();
                    avoidLogin = authPower.avoidLogin();
                    avoidPower = authPower.avoidPower();
                    avoidSign = authPower.avoidSign();
                    avoidPlatform=authPower.avoidPlatform();
                }
    
                String platform =  request.getHeader(TokenConstants.X_PLATFORM);
    
                if(!avoidPlatform&&(StringUtils.isEmpty(platform) || PlatformType.getTypeByPlatform(platform) == null)){
                    throw new AppWebException("平台类型异常:只能为PC、ANDROID、IOS");
                }
    
                String version = "/api/".concat(APP_VERSION);
    
                // 版本号校验
                if(!avoidVersion && !uri.startsWith(version)){
                    throw new AppWebException("版本参数异常,当前版本"+version);
                }
    
                String tokenAuth = request.getHeader(DEFAULT_TOKEN_NAME);
    
                // 登录校验
                if(!avoidLogin){
                    // token 是否为空  以及redis中获取token是否存在
                    if(StringUtils.isEmpty(tokenAuth)){
                        throw new AppWebException("X-Token不能为空!");
                    }
    
                    String userId = JWTUtil.getUserId(tokenAuth);
                    if(userId == null){
                        throw new AppWebException("登陆超时,请重新登陆!");
                    }
    
                    // 延长token时间
                    
                    //RedisUtils.put(TokenConstants.CURRENT_LOGIN_TOKEN, tokenAuth, String.valueOf(userId), TokenConstants.TOKEN_EXPIRES_TIME);
                }
    
                if(!avoidPower){
                    // 需要判断用户是否有权访问接口 -- db内配置用户角色接口访问权限
                    throw new AppWebException("没有访问权限!");
                }
    
                String signAuth = request.getHeader(DEFAULT_AUTH_NAME);
                if(!avoidSign&&StringUtils.isEmpty(signAuth)){
                    // 判断是否需要校验参数规则  
                    throw new AppWebException("非法参数加密值 !");
    
                }
    
                /*if(request instanceof BodyReaderHttpServletRequestWrapper){
    
                    BodyReaderHttpServletRequestWrapper requestWrapper = (BodyReaderHttpServletRequestWrapper) request;
    
                    // 请求body不为空
                    BufferedReader reader = requestWrapper.getReader();
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }
    
                    System.out.println("--------------------------" + sb.toString());
                }*/
    
    
                return super.preHandle(request, response, handler);
            }
        }
    }
  • 相关阅读:
    [洛谷P3931]SAC E#1
    洛谷 P4127 [AHOI2009]同类分布 解题报告
    洛谷 P4475 巧克力王国 解题报告
    洛谷 P4148 简单题 解题报告
    洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告
    洛谷 P4211 [LNOI2014]LCA 解题报告
    洛谷 P4074 [WC2013]糖果公园 解题报告
    AT1219 歴史の研究 解题报告
    洛谷 P4137 Rmq Problem /mex 解题报告
    THUWC2019 摸鱼记
  • 原文地址:https://www.cnblogs.com/dsh2018/p/11245922.html
Copyright © 2011-2022 走看看