SpringBoot筆記7:WebMvcConfigurerAdapter 經常使用配置

@Component
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    Logger logger= LoggerFactory.getLogger(this.getClass());


    //使用阿里 FastJson 做爲JSON MessageConverter
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter4 converter = new FastJsonHttpMessageConverter4();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,//保留空的字段
                SerializerFeature.WriteNullStringAsEmpty,//String null -> ""
                SerializerFeature.WriteNullNumberAsZero);//Number null -> 0
        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        converters.add(converter);
    }

    //註冊自定義的攔截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        super.addInterceptors(registry);
    }

    //處理業務拋出的異常 在這裏進行統一處理
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
        super.configureHandlerExceptionResolvers(exceptionResolvers);
        exceptionResolvers.add((httpServletRequest, response, o, e) -> {
            ResultData result=null;
            if (e instanceof BusinessException){
                result= ResultData.makeFailResult(e.getMessage());
                logger.error(e.getMessage());
                e.printStackTrace();
            }

            if (e instanceof ApiAutheException){
                result=ResultData.makeFailResult(-1,e.getMessage());
                e.printStackTrace();
                logger.error(e.getMessage());
            }

            writeResult(response,result);

            return new ModelAndView();
        });
    }


    //請求跨域
    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**")
                .allowedOrigins(CorsConfiguration.ALL)
                .allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS");
        super.addCorsMappings(registry);
    }

    //獲取客戶端的ip
    private String getClientIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        // 若是是多級代理,那麼取第一個ip爲客戶端ip
        if (ip != null && ip.contains(",")) {
            ip = ip.substring(0, ip.indexOf(",")).trim();
        }

        return ip;
    }

    private void writeResult(HttpServletResponse response, ResultData result){
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-type", "application/json;charset=UTF-8");
        response.setStatus(200);
        PrintWriter writer=null;
        try {
            writer=response.getWriter();
            response.getWriter().write(JSON.toJSONString(result));
        } catch (IOException ex) {
            logger.error(ex.getMessage());
        }finally {
            if (writer!=null){
                writer.close();
            }
        }
    }
}
相關文章
相關標籤/搜索