接口开发-拦截器

因为时间问题,直接说重点了。关于什么是拦截器?SpringBoot应该怎么集成?拦截器能做什么用,请自行百度。

通过拦截器,我们要解决两大问题,第一、跨域访问;第二、用户鉴权;

 

一、文件目录

 

二、ApiInterceptor

package com.univalsoft.common.interceptor;

import com.univalsoft.common.model.APIResponse;
import com.univalsoft.tools.HttpTools;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Arrays;


public class ApiInterceptor implements HandlerInterceptor {

    //
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

    }


    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
            throws Exception {
    }

    // 拦截器
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 设置跨域访问
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");

        return true;

//        // 其他业务判断
//        String[] noAuthApis = {
//                "/api/account/login", // 登录
//        };
//
//        String requestURI = request.getRequestURI();
//        if (!Arrays.asList(noAuthApis).contains(requestURI)) {
//            System.out.println("需要验证");
//
//            boolean canRequest = true;
//            if (canRequest) {
//                return true;
//            } else {
//                APIResponse error = new APIResponse();
//                error.fail(APIResponse.ERROR_AUTH_FAIL, null);
//                HttpTools.sendJsonMessage(response, error);
//                return false;
//            }
//        }
//
//        System.out.println("拦截器执行完毕");
//        return true;
    }
}

  

三、ApiInterceptorConf

package com.univalsoft.common.interceptor;

import com.univalsoft.tools.PropertiesTools;
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.WebMvcConfigurationSupport;

@Configuration
public class ApiInterceptorConf extends WebMvcConfigurationSupport {

    @Bean
    public HandlerInterceptor apiInterceptor() {
        return new ApiInterceptor();

    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 注册自己的拦截器
        // 拦截所有请求
        registry.addInterceptor(apiInterceptor()).addPathPatterns("/api/**");

        super.addInterceptors(registry);
    }


    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {

        // 接口文档
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");

        // 图片服务
        String _imagePath = PropertiesTools.applicationProperty("app.image.path");
        registry.addResourceHandler("/image/**")
                .addResourceLocations("file:" + _imagePath);

        // APP H5
        registry.addResourceHandler("/app/**")
                .addResourceLocations("classpath:/public/app/");

        super.addResourceHandlers(registry);
    }
}

 

经过上面的设置,接口的跨域访问就解决了,关于用户鉴权部分,注释掉了,有兴趣的可以研究一下。  

 

posted @ 2019-01-07 14:46  环球移动团队  阅读(874)  评论(0)    收藏  举报