SpringBootプロジェクトブロック構成の前後端分離

19554 ワード

前言
最近、SpringBootフレームワークに基づく前後端分離プロジェクトを「構築」する必要があります.その中でブロックを配置する必要があります.多角的に資料を調べて、最終的に以下の内容をまとめます.
ブロッキング構成
以下はブロックの基本構成である.
  • によってブロックされた要求は、まずtoken情報を検証し、ここでtoken情報はredisに格納される.
  • ブロッキングは、ドメイン間要求(OPTIONS要求の処理)
  • をサポートする.
  • ブロッカーの返却情報は、自分のニーズに合わせて
  • をカスタマイズすることが望ましい.
    /**
     * @program: share
     * @description:      
     * @author: Mr.Jkx
     * @create: 2020-03-11 17:22
     */
    @Component
    public class LoginInterceptor implements HandlerInterceptor {
        @Resource
        private RedisService redisService;
    
        /**
         *        ,         
         *    :true      ;false      ,                
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            //   OPTIONS  (    ),     “    >>>http      cors   options       ”
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Credentials", "true");
            response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
            response.setHeader("Access-Control-Max-Age", "86400");
            response.setHeader("Access-Control-Allow-Headers", "*");
            response.setHeader("Content-Type", "text/html;charset=utf-8");
            if (request.getMethod().equals("OPTIONS")) {
                response.setStatus(HttpServletResponse.SC_OK);
                return false;
            }
            // token     
            String token = request.getHeader("token");
            if (StringUtils.isNotBlank(token)) {
                // redis  token  
                if (null != redisService.get(token)) {
                    return true;
                } else {
                    returnJson(response, "     ");
                }
            } else {
                returnJson(response, "          ");
            }
            return false;
        }
    
        /**
         *        ,     (controller)    ,        
         *         modelAndView                 
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        /**
         *             ,           ,
         *                          ,
         *            ,   try-catch-finally  finally,
         *            
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    
        /**
         * @Description:       
         * @Author: Mr.Jkx
         * @date: 2020/3/12 13:46
         */
        private void returnJson(HttpServletResponse response, String msgData) {
            PrintWriter writer = null;
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json; charset=utf-8");
            try {
                writer = response.getWriter();
                Msg msg = Msg.fail().add("info", msgData);
                String res = JsonUtil.toJsonString(msg);
                writer.print(res);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (writer != null) {
                    writer.close();
                }
            }
        }
    } 
    
  • addPathPatterns:すべてのリクエストをブロック
  • excludePathPatterns:ブロックしない要求を設定
  • addResourceHandler:静的リソースタイプ
  • addResourceLocations:静的リソースが存在するディレクトリ(http://localhost:8080/xxx.html)
  • @Configuration
    public class InterceptorConfig extends WebMvcConfigurationSupport {
        @Autowired
        private LoginInterceptor loginInterceptor;
        @Autowired
        private ResourcesConfig resourcesConfig;
    
        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            //              
            // addPathPatterns         ,/**        
            // excludePathPatterns       
            registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
                    .excludePathPatterns(
                            "/**.html",
                            "/**/*.js",
                            "/**/*.jpg",
                            "/**/*.png",
                            "/**/*.gif",
                            "/**/*.css",
                            "/**/*.ts",
                            "/user/userLogin",
                            "/personage/addPersonage",
                            "/file/uploadFile",
                            "/file/uploadFileOfBatch",
                            "/file/download",
                            "/file/uploadRichTextFile");
            super.addInterceptors(registry);
        }
    
        /**
         * @Description:         
         * @Author: Mr.Jkx
         * @date: 2020/3/18 16:45
         * file:        
         */
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler(
                    "/**.html",
                    "/**/*.js",
                    "/**/*.jpg",
                    "/**/*.png",
                    "/**/*.gif",
                    "/**/*.css",
                    "/**/*.ts")
                    .addResourceLocations("file:" + resourcesConfig.getWebpagepath(),
                            "file:" + resourcesConfig.getReadimagepath());
        }
    }
    

    リファレンスリンク
  • httpのプロトコルのドメイン間corsおよびoptions要求のいくつかの理解
  • 本文は作者のために问题を解决するために整理の1つの小さい结び目を探して、不足あるいは安全な隠れた危険性があるかもしれなくて、とてもみんなのコメントの伝言を期待して、一方で自分の1つの学习の整理の成果を検査して、一方でやはりみんなと学びたいと思って、みんなの批判の指摘を歓迎して、ありがとうございます!!